diff options
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-empress.c')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-empress.c | 54 |
1 files changed, 33 insertions, 21 deletions
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c index 2a5ab957542d..c0c5d7509c25 100644 --- a/drivers/media/video/saa7134/saa7134-empress.c +++ b/drivers/media/video/saa7134/saa7134-empress.c | |||
@@ -89,14 +89,14 @@ static int ts_open(struct inode *inode, struct file *file) | |||
89 | err = -EBUSY; | 89 | err = -EBUSY; |
90 | if (!mutex_trylock(&dev->empress_tsq.vb_lock)) | 90 | if (!mutex_trylock(&dev->empress_tsq.vb_lock)) |
91 | goto done; | 91 | goto done; |
92 | if (dev->empress_users) | 92 | if (atomic_read(&dev->empress_users)) |
93 | goto done_up; | 93 | goto done_up; |
94 | 94 | ||
95 | /* Unmute audio */ | 95 | /* Unmute audio */ |
96 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | 96 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, |
97 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6)); | 97 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6)); |
98 | 98 | ||
99 | dev->empress_users++; | 99 | atomic_inc(&dev->empress_users); |
100 | file->private_data = dev; | 100 | file->private_data = dev; |
101 | err = 0; | 101 | err = 0; |
102 | 102 | ||
@@ -110,8 +110,6 @@ static int ts_release(struct inode *inode, struct file *file) | |||
110 | { | 110 | { |
111 | struct saa7134_dev *dev = file->private_data; | 111 | struct saa7134_dev *dev = file->private_data; |
112 | 112 | ||
113 | mutex_lock(&dev->empress_tsq.vb_lock); | ||
114 | |||
115 | videobuf_stop(&dev->empress_tsq); | 113 | videobuf_stop(&dev->empress_tsq); |
116 | videobuf_mmap_free(&dev->empress_tsq); | 114 | videobuf_mmap_free(&dev->empress_tsq); |
117 | 115 | ||
@@ -122,9 +120,7 @@ static int ts_release(struct inode *inode, struct file *file) | |||
122 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, | 120 | saa_writeb(SAA7134_AUDIO_MUTE_CTRL, |
123 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); | 121 | saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); |
124 | 122 | ||
125 | dev->empress_users--; | 123 | atomic_dec(&dev->empress_users); |
126 | |||
127 | mutex_unlock(&dev->empress_tsq.vb_lock); | ||
128 | 124 | ||
129 | return 0; | 125 | return 0; |
130 | } | 126 | } |
@@ -333,6 +329,22 @@ static int empress_g_ext_ctrls(struct file *file, void *priv, | |||
333 | return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls); | 329 | return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls); |
334 | } | 330 | } |
335 | 331 | ||
332 | static int empress_g_ctrl(struct file *file, void *priv, | ||
333 | struct v4l2_control *c) | ||
334 | { | ||
335 | struct saa7134_dev *dev = file->private_data; | ||
336 | |||
337 | return saa7134_g_ctrl_internal(dev, NULL, c); | ||
338 | } | ||
339 | |||
340 | static int empress_s_ctrl(struct file *file, void *priv, | ||
341 | struct v4l2_control *c) | ||
342 | { | ||
343 | struct saa7134_dev *dev = file->private_data; | ||
344 | |||
345 | return saa7134_s_ctrl_internal(dev, NULL, c); | ||
346 | } | ||
347 | |||
336 | static int empress_queryctrl(struct file *file, void *priv, | 348 | static int empress_queryctrl(struct file *file, void *priv, |
337 | struct v4l2_queryctrl *c) | 349 | struct v4l2_queryctrl *c) |
338 | { | 350 | { |
@@ -400,16 +412,7 @@ static const struct file_operations ts_fops = | |||
400 | .llseek = no_llseek, | 412 | .llseek = no_llseek, |
401 | }; | 413 | }; |
402 | 414 | ||
403 | /* ----------------------------------------------------------- */ | 415 | static const struct v4l2_ioctl_ops ts_ioctl_ops = { |
404 | |||
405 | static struct video_device saa7134_empress_template = | ||
406 | { | ||
407 | .name = "saa7134-empress", | ||
408 | .type = 0 /* FIXME */, | ||
409 | .type2 = 0 /* FIXME */, | ||
410 | .fops = &ts_fops, | ||
411 | .minor = -1, | ||
412 | |||
413 | .vidioc_querycap = empress_querycap, | 416 | .vidioc_querycap = empress_querycap, |
414 | .vidioc_enum_fmt_vid_cap = empress_enum_fmt_vid_cap, | 417 | .vidioc_enum_fmt_vid_cap = empress_enum_fmt_vid_cap, |
415 | .vidioc_s_fmt_vid_cap = empress_s_fmt_vid_cap, | 418 | .vidioc_s_fmt_vid_cap = empress_s_fmt_vid_cap, |
@@ -428,8 +431,17 @@ static struct video_device saa7134_empress_template = | |||
428 | 431 | ||
429 | .vidioc_queryctrl = empress_queryctrl, | 432 | .vidioc_queryctrl = empress_queryctrl, |
430 | .vidioc_querymenu = empress_querymenu, | 433 | .vidioc_querymenu = empress_querymenu, |
431 | .vidioc_g_ctrl = saa7134_g_ctrl, | 434 | .vidioc_g_ctrl = empress_g_ctrl, |
432 | .vidioc_s_ctrl = saa7134_s_ctrl, | 435 | .vidioc_s_ctrl = empress_s_ctrl, |
436 | }; | ||
437 | |||
438 | /* ----------------------------------------------------------- */ | ||
439 | |||
440 | static struct video_device saa7134_empress_template = { | ||
441 | .name = "saa7134-empress", | ||
442 | .fops = &ts_fops, | ||
443 | .minor = -1, | ||
444 | .ioctl_ops = &ts_ioctl_ops, | ||
433 | 445 | ||
434 | .tvnorms = SAA7134_NORMS, | 446 | .tvnorms = SAA7134_NORMS, |
435 | .current_norm = V4L2_STD_PAL, | 447 | .current_norm = V4L2_STD_PAL, |
@@ -445,7 +457,7 @@ static void empress_signal_update(struct work_struct *work) | |||
445 | ts_reset_encoder(dev); | 457 | ts_reset_encoder(dev); |
446 | } else { | 458 | } else { |
447 | dprintk("video signal acquired\n"); | 459 | dprintk("video signal acquired\n"); |
448 | if (dev->empress_users) | 460 | if (atomic_read(&dev->empress_users)) |
449 | ts_init_encoder(dev); | 461 | ts_init_encoder(dev); |
450 | } | 462 | } |
451 | } | 463 | } |
@@ -465,7 +477,7 @@ static int empress_init(struct saa7134_dev *dev) | |||
465 | if (NULL == dev->empress_dev) | 477 | if (NULL == dev->empress_dev) |
466 | return -ENOMEM; | 478 | return -ENOMEM; |
467 | *(dev->empress_dev) = saa7134_empress_template; | 479 | *(dev->empress_dev) = saa7134_empress_template; |
468 | dev->empress_dev->dev = &dev->pci->dev; | 480 | dev->empress_dev->parent = &dev->pci->dev; |
469 | dev->empress_dev->release = video_device_release; | 481 | dev->empress_dev->release = video_device_release; |
470 | snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name), | 482 | snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name), |
471 | "%s empress (%s)", dev->name, | 483 | "%s empress (%s)", dev->name, |