Browse Source

[media] em28xx: add support for DVB monitor led

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>
Mauro Carvalho Chehab 11 years ago
parent
commit
54e925498c
2 changed files with 15 additions and 12 deletions
  1. 14 12
      drivers/media/usb/em28xx/em28xx-core.c
  2. 1 0
      drivers/media/usb/em28xx/em28xx.h

+ 14 - 12
drivers/media/usb/em28xx/em28xx-core.c

@@ -619,6 +619,7 @@ EXPORT_SYMBOL_GPL(em28xx_find_led);
 int em28xx_capture_start(struct em28xx *dev, int start)
 int em28xx_capture_start(struct em28xx *dev, int start)
 {
 {
 	int rc;
 	int rc;
+	const struct em28xx_led *led = NULL;
 
 
 	if (dev->chip_id == CHIP_ID_EM2874 ||
 	if (dev->chip_id == CHIP_ID_EM2874 ||
 	    dev->chip_id == CHIP_ID_EM2884 ||
 	    dev->chip_id == CHIP_ID_EM2884 ||
@@ -643,6 +644,8 @@ int em28xx_capture_start(struct em28xx *dev, int start)
 
 
 			/* Enable video capture */
 			/* Enable video capture */
 			rc = em28xx_write_reg(dev, 0x48, 0x00);
 			rc = em28xx_write_reg(dev, 0x48, 0x00);
+			if (rc < 0)
+				return rc;
 
 
 			if (dev->mode == EM28XX_ANALOG_MODE)
 			if (dev->mode == EM28XX_ANALOG_MODE)
 				rc = em28xx_write_reg(dev,
 				rc = em28xx_write_reg(dev,
@@ -650,6 +653,8 @@ int em28xx_capture_start(struct em28xx *dev, int start)
 			else
 			else
 				rc = em28xx_write_reg(dev,
 				rc = em28xx_write_reg(dev,
 						    EM28XX_R12_VINENABLE, 0x37);
 						    EM28XX_R12_VINENABLE, 0x37);
+			if (rc < 0)
+				return rc;
 
 
 			msleep(6);
 			msleep(6);
 		} else {
 		} 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);
 		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;
 	return rc;
 }
 }

+ 1 - 0
drivers/media/usb/em28xx/em28xx.h

@@ -401,6 +401,7 @@ enum em28xx_adecoder {
 
 
 enum em28xx_led_role {
 enum em28xx_led_role {
 	EM28XX_LED_ANALOG_CAPTURING = 0,
 	EM28XX_LED_ANALOG_CAPTURING = 0,
+	EM28XX_LED_DIGITAL_CAPTURING,
 	EM28XX_LED_ILLUMINATION,
 	EM28XX_LED_ILLUMINATION,
 	EM28XX_NUM_LED_ROLES, /* must be the last */
 	EM28XX_NUM_LED_ROLES, /* must be the last */
 };
 };