[media] soc_camera: remove the now obsolete struct soc_camera_ops
[pandora-kernel.git] / drivers / media / video / stk-webcam.c
index d1a2cef..cbc105f 100644 (file)
@@ -55,6 +55,8 @@ MODULE_AUTHOR("Jaime Velasco Juan <jsagarribay@gmail.com> and Nicolas VIVIEN");
 MODULE_DESCRIPTION("Syntek DC1125 webcam driver");
 
 
+/* bool for webcam LED management */
+int first_init = 1;
 
 /* Some cameras have audio interfaces, we aren't interested in those */
 static struct usb_device_id stkwebcam_table[] = {
@@ -518,7 +520,7 @@ static int stk_prepare_sio_buffers(struct stk_camera *dev, unsigned n_sbufs)
                        return -ENOMEM;
                for (i = 0; i < n_sbufs; i++) {
                        if (stk_setup_siobuf(dev, i))
-                               return (dev->n_sbufs > 1)? 0 : -ENOMEM;
+                               return (dev->n_sbufs > 1 ? 0 : -ENOMEM);
                        dev->n_sbufs = i+1;
                }
        }
@@ -558,9 +560,14 @@ static int v4l_stk_open(struct file *fp)
        vdev = video_devdata(fp);
        dev = vdev_to_camera(vdev);
 
-       if (dev == NULL || !is_present(dev)) {
+       if (dev == NULL || !is_present(dev))
                return -ENXIO;
-       }
+
+       if (!first_init)
+               stk_camera_write_reg(dev, 0x0, 0x24);
+       else
+               first_init = 0;
+
        fp->private_data = dev;
        usb_autopm_get_interface(dev->interface);
 
@@ -574,10 +581,12 @@ static int v4l_stk_release(struct file *fp)
        if (dev->owner == fp) {
                stk_stop_stream(dev);
                stk_free_buffers(dev);
+               stk_camera_write_reg(dev, 0x0, 0x49); /* turn off the LED */
+               unset_initialised(dev);
                dev->owner = NULL;
        }
 
-       if(is_present(dev))
+       if (is_present(dev))
                usb_autopm_put_interface(dev->interface);
 
        return 0;
@@ -654,7 +663,7 @@ static unsigned int v4l_stk_poll(struct file *fp, poll_table *wait)
                return POLLERR;
 
        if (!list_empty(&dev->sio_full))
-               return (POLLIN | POLLRDNORM);
+               return POLLIN | POLLRDNORM;
 
        return 0;
 }
@@ -891,9 +900,9 @@ static int stk_vidioc_g_fmt_vid_cap(struct file *filp,
        struct stk_camera *dev = priv;
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(stk_sizes)
-                       && stk_sizes[i].m != dev->vsettings.mode;
-               i++);
+       for (i = 0; i < ARRAY_SIZE(stk_sizes) &&
+                       stk_sizes[i].m != dev->vsettings.mode; i++)
+               ;
        if (i == ARRAY_SIZE(stk_sizes)) {
                STK_ERROR("ERROR: mode invalid\n");
                return -EINVAL;
@@ -1305,9 +1314,8 @@ static int stk_camera_probe(struct usb_interface *interface,
        usb_set_intfdata(interface, dev);
 
        err = stk_register_video_device(dev);
-       if (err) {
+       if (err)
                goto error;
-       }
 
        return 0;
 
@@ -1350,6 +1358,7 @@ static int stk_camera_resume(struct usb_interface *intf)
                return 0;
        unset_initialised(dev);
        stk_initialise(dev);
+       stk_camera_write_reg(dev, 0x0, 0x49);
        stk_setup_format(dev);
        if (is_streaming(dev))
                stk_start_stream(dev);