[media] em28xx: add support for DVB monitor led
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 4 Mar 2014 15:33:45 +0000 (12:33 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 4 Mar 2014 17:44:09 +0000 (14:44 -0300)
Some devices have a LED to indicate when DVB capture started.
Add support for it.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/em28xx/em28xx-core.c
drivers/media/usb/em28xx/em28xx.h

index 6de41c6a0770d2e3655d3c1c557fbee3982aa5f4..523d7e92bf47b7974515a1d9acd2fc19ab131b51 100644 (file)
@@ -619,6 +619,7 @@ EXPORT_SYMBOL_GPL(em28xx_find_led);
 int em28xx_capture_start(struct em28xx *dev, int start)
 {
        int rc;
+       const struct em28xx_led *led = NULL;
 
        if (dev->chip_id == CHIP_ID_EM2874 ||
            dev->chip_id == CHIP_ID_EM2884 ||
@@ -643,6 +644,8 @@ int em28xx_capture_start(struct em28xx *dev, int start)
 
                        /* Enable video capture */
                        rc = em28xx_write_reg(dev, 0x48, 0x00);
+                       if (rc < 0)
+                               return rc;
 
                        if (dev->mode == EM28XX_ANALOG_MODE)
                                rc = em28xx_write_reg(dev,
@@ -650,6 +653,8 @@ int em28xx_capture_start(struct em28xx *dev, int start)
                        else
                                rc = em28xx_write_reg(dev,
                                                    EM28XX_R12_VINENABLE, 0x37);
+                       if (rc < 0)
+                               return rc;
 
                        msleep(6);
                } else {
@@ -658,19 +663,16 @@ int em28xx_capture_start(struct em28xx *dev, int start)
                }
        }
 
-       if (rc < 0)
-               return rc;
-
-       /* Switch (explicitly controlled) analog capturing LED on/off */
-       if (dev->mode == EM28XX_ANALOG_MODE) {
-               const struct em28xx_led *led;
+       if (dev->mode == EM28XX_ANALOG_MODE)
                led = em28xx_find_led(dev, EM28XX_LED_ANALOG_CAPTURING);
-               if (led)
-                       em28xx_write_reg_bits(dev, led->gpio_reg,
-                                             (!start ^ led->inverted) ?
-                                             ~led->gpio_mask : led->gpio_mask,
-                                             led->gpio_mask);
-       }
+       else
+               led = em28xx_find_led(dev, EM28XX_LED_DIGITAL_CAPTURING);
+
+       if (led)
+               em28xx_write_reg_bits(dev, led->gpio_reg,
+                                     (!start ^ led->inverted) ?
+                                     ~led->gpio_mask : led->gpio_mask,
+                                     led->gpio_mask);
 
        return rc;
 }
index 3b08556376e30229933c6418d2c0722237b4a4db..9e44f5bfc48b0c62b5c20ce809fdaea0a1358b56 100644 (file)
@@ -401,6 +401,7 @@ enum em28xx_adecoder {
 
 enum em28xx_led_role {
        EM28XX_LED_ANALOG_CAPTURING = 0,
+       EM28XX_LED_DIGITAL_CAPTURING,
        EM28XX_LED_ILLUMINATION,
        EM28XX_NUM_LED_ROLES, /* must be the last */
 };