[media] cx88: don't use atomic_t for core->mpeg_users
[cascardo/linux.git] / drivers / media / video / cx88 / cx88-blackbird.c
index bca307e..11e49bb 100644 (file)
@@ -1060,18 +1060,21 @@ static int mpeg_open(struct file *file)
 
        /* Make sure we can acquire the hardware */
        drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
-       if (drv) {
-               err = drv->request_acquire(drv);
-               if(err != 0) {
-                       dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err);
-                       mutex_unlock(&dev->core->lock);
-                       return err;
-               }
+       if (!drv) {
+               dprintk(1, "%s: blackbird driver is not loaded\n", __func__);
+               mutex_unlock(&dev->core->lock);
+               return -ENODEV;
+       }
+
+       err = drv->request_acquire(drv);
+       if (err != 0) {
+               dprintk(1,"%s: Unable to acquire hardware, %d\n", __func__, err);
+               mutex_unlock(&dev->core->lock);
+               return err;
        }
 
-       if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) {
-               if (drv)
-                       drv->request_release(drv);
+       if (!dev->core->mpeg_users && blackbird_initialize_codec(dev) < 0) {
+               drv->request_release(drv);
                mutex_unlock(&dev->core->lock);
                return -EINVAL;
        }
@@ -1080,8 +1083,7 @@ static int mpeg_open(struct file *file)
        /* allocate + initialize per filehandle data */
        fh = kzalloc(sizeof(*fh),GFP_KERNEL);
        if (NULL == fh) {
-               if (drv)
-                       drv->request_release(drv);
+               drv->request_release(drv);
                mutex_unlock(&dev->core->lock);
                return -ENOMEM;
        }
@@ -1099,7 +1101,7 @@ static int mpeg_open(struct file *file)
        cx88_set_scale(dev->core, dev->width, dev->height,
                        fh->mpegq.field);
 
-       atomic_inc(&dev->core->mpeg_users);
+       dev->core->mpeg_users++;
        mutex_unlock(&dev->core->lock);
        return 0;
 }
@@ -1110,7 +1112,9 @@ static int mpeg_release(struct file *file)
        struct cx8802_dev *dev = fh->dev;
        struct cx8802_driver *drv = NULL;
 
-       if (dev->mpeg_active && atomic_read(&dev->core->mpeg_users) == 1)
+       mutex_lock(&dev->core->lock);
+
+       if (dev->mpeg_active && dev->core->mpeg_users == 1)
                blackbird_stop_codec(dev);
 
        cx8802_cancel_buffers(fh->dev);
@@ -1119,17 +1123,18 @@ static int mpeg_release(struct file *file)
 
        videobuf_mmap_free(&fh->mpegq);
 
-       mutex_lock(&dev->core->lock);
        file->private_data = NULL;
        kfree(fh);
-       mutex_unlock(&dev->core->lock);
 
        /* Make sure we release the hardware */
        drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
+       WARN_ON(!drv);
        if (drv)
                drv->request_release(drv);
 
-       atomic_dec(&dev->core->mpeg_users);
+       dev->core->mpeg_users--;
+
+       mutex_unlock(&dev->core->lock);
 
        return 0;
 }
@@ -1334,11 +1339,9 @@ static int cx8802_blackbird_probe(struct cx8802_driver *drv)
        blackbird_register_video(dev);
 
        /* initial device configuration: needed ? */
-       mutex_lock(&dev->core->lock);
 //     init_controls(core);
        cx88_set_tvnorm(core,core->tvnorm);
        cx88_video_mux(core,0);
-       mutex_unlock(&dev->core->lock);
 
        return 0;