Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.4.13 /drivers/usb/pwc-ctrl.c

Filename:/drivers/usb/pwc-ctrl.c
Lines Added:40
Lines Deleted:29
Also changed in: (Previous) 2.4.13-pre6  2.4.13-pre5  2.4.13-pre4  2.4.12-ac6  2.4.12-ac4  2.4.12-ac5 
(Following) 2.4.17-pre3  2.4.17-pre4  2.4.17-pre5  2.4.17-pre6  2.4.17-pre7  2.4.17-pre8 

Location
[  2.4.13
  [  drivers
    [  usb
       o  pwc-ctrl.c

Patch

diff -u --recursive --new-file v2.4.12/linux/drivers/usb/pwc-ctrl.c linux/drivers/usb/pwc-ctrl.c
--- v2.4.12/linux/drivers/usb/pwc-ctrl.c   Sun Sep 23 11:41:00 2001
+++ linux/drivers/usb/pwc-ctrl.c   Wed Oct 17 14:34:06 2001
@@ -495,7 +495,7 @@
 }
 
 
-#ifdef __KERNEL__
+
 /* BRIGHTNESS */
 
 int pwc_get_brightness(struct pwc_device *pdev)
@@ -983,6 +983,7 @@
    
    return (buf << 8);
 }
+
 static inline int pwc_read_blue_gain(struct pwc_device *pdev)
 {
    unsigned char buf;
@@ -1001,43 +1002,55 @@
    return (buf << 8);
 }
 
-/* still unused (it doesn't work yet...) */
-static inline int pwc_set_led(struct pwc_device *pdev, int value)
+int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value)
 {
-   unsigned char buf;
+   unsigned char buf[2];
 
-   if (value < 0)
-      value = 0;
-   if (value > 0xffff)
-      value = 0xffff;
+   if (pdev->type < 730)
+      return 0;
+   if (on_value < 0)
+      on_value = 0;
+   if (on_value > 0xff)
+      on_value = 0xff;
+   if (off_value < 0)
+      off_value = 0;
+   if (off_value > 0xff)
+      off_value = 0xff;
 
-   buf = (value >> 8);
+   buf[0] = on_value;
+   buf[1] = off_value;
 
    return usb_control_msg(pdev->udev, usb_sndctrlpipe(pdev->udev, 0),
       SET_STATUS_CTL,
       USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
       LED_FORMATTER,
       pdev->vcinterface,
-      &buf, 1, HZ / 2);
+      &buf, 2, HZ / 2);
 }
 
-/* still unused (it doesn't work yet...) */
-static inline int pwc_get_led(struct pwc_device *pdev)
+int pwc_get_leds(struct pwc_device *pdev, int *on_value, int *off_value)
 {
-   unsigned char buf;
+   unsigned char buf[2];
    int ret;
    
+   if (pdev->type < 730) {
+      *on_value = -1;
+      *off_value = -1;
+      return 0;
+   }
+
    ret = usb_control_msg(pdev->udev, usb_rcvctrlpipe(pdev->udev, 0),
               GET_STATUS_CTL,
       USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
       LED_FORMATTER,
       pdev->vcinterface,
-      &buf, 1, HZ / 2);
+      &buf, 2, HZ / 2);
 
    if (ret < 0)
-       return ret;
-   
-   return (buf << 8);
+      return ret;
+   *on_value = buf[0];
+   *off_value = buf[1];
+   return 0;
 }
 
  /* End of Add-Ons                                    */
@@ -1167,15 +1180,15 @@
 
         case VIDIOCPWCSLED:
    {
-       int led, ret;
-       if (copy_from_user(&led,arg,sizeof(led)))
-      return -EFAULT;
-       else {
-      /* ret = pwc_set_led(pdev, led); */
-      ret = 0;
+      int ret;
+      struct pwc_leds leds;
+
+      if (copy_from_user(&leds, arg, sizeof(leds)))
+         return -EFAULT;
+
+      ret = pwc_set_leds(pdev, leds.led_on, leds.led_off);
       if (ret<0)
           return ret;
-       }
        break;
    }
 
@@ -1184,11 +1197,12 @@
    case VIDIOCPWCGLED:
    {
       int led;
+      struct pwc_leds leds;
       
-      led = pwc_get_led(pdev); 
+      led = pwc_get_leds(pdev, &leds.led_on, &leds.led_off); 
       if (led < 0)
          return -EINVAL;
-      if (copy_to_user(arg, &led, sizeof(led)))
+      if (copy_to_user(arg, &leds, sizeof(leds)))
          return -EFAULT;
       break;
    }
@@ -1202,9 +1216,6 @@
    }
    return 0;
 }
-
-#endif
-
 
 
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.