|
@@ -608,46 +608,51 @@ int em28xx_capture_start(struct em28xx *dev, int start)
|
|
|
dev->chip_id == CHIP_ID_EM2884 ||
|
|
dev->chip_id == CHIP_ID_EM2884 ||
|
|
|
dev->chip_id == CHIP_ID_EM28174) {
|
|
dev->chip_id == CHIP_ID_EM28174) {
|
|
|
/* The Transport Stream Enable Register moved in em2874 */
|
|
/* The Transport Stream Enable Register moved in em2874 */
|
|
|
- if (!start) {
|
|
|
|
|
- rc = em28xx_write_reg_bits(dev, EM2874_R5F_TS_ENABLE,
|
|
|
|
|
- 0x00,
|
|
|
|
|
- EM2874_TS1_CAPTURE_ENABLE);
|
|
|
|
|
- return rc;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- /* Enable Transport Stream */
|
|
|
|
|
rc = em28xx_write_reg_bits(dev, EM2874_R5F_TS_ENABLE,
|
|
rc = em28xx_write_reg_bits(dev, EM2874_R5F_TS_ENABLE,
|
|
|
- EM2874_TS1_CAPTURE_ENABLE,
|
|
|
|
|
|
|
+ start ?
|
|
|
|
|
+ EM2874_TS1_CAPTURE_ENABLE : 0x00,
|
|
|
EM2874_TS1_CAPTURE_ENABLE);
|
|
EM2874_TS1_CAPTURE_ENABLE);
|
|
|
- return rc;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ /* FIXME: which is the best order? */
|
|
|
|
|
+ /* video registers are sampled by VREF */
|
|
|
|
|
+ rc = em28xx_write_reg_bits(dev, EM28XX_R0C_USBSUSP,
|
|
|
|
|
+ start ? 0x10 : 0x00, 0x10);
|
|
|
|
|
+ if (rc < 0)
|
|
|
|
|
+ return rc;
|
|
|
|
|
|
|
|
- /* FIXME: which is the best order? */
|
|
|
|
|
- /* video registers are sampled by VREF */
|
|
|
|
|
- rc = em28xx_write_reg_bits(dev, EM28XX_R0C_USBSUSP,
|
|
|
|
|
- start ? 0x10 : 0x00, 0x10);
|
|
|
|
|
- if (rc < 0)
|
|
|
|
|
- return rc;
|
|
|
|
|
|
|
+ if (start) {
|
|
|
|
|
+ if (dev->board.is_webcam)
|
|
|
|
|
+ rc = em28xx_write_reg(dev, 0x13, 0x0c);
|
|
|
|
|
|
|
|
- if (!start) {
|
|
|
|
|
- /* disable video capture */
|
|
|
|
|
- rc = em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x27);
|
|
|
|
|
- return rc;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ /* Enable video capture */
|
|
|
|
|
+ rc = em28xx_write_reg(dev, 0x48, 0x00);
|
|
|
|
|
|
|
|
- if (dev->board.is_webcam)
|
|
|
|
|
- rc = em28xx_write_reg(dev, 0x13, 0x0c);
|
|
|
|
|
|
|
+ if (dev->mode == EM28XX_ANALOG_MODE)
|
|
|
|
|
+ rc = em28xx_write_reg(dev,
|
|
|
|
|
+ EM28XX_R12_VINENABLE, 0x67);
|
|
|
|
|
+ else
|
|
|
|
|
+ rc = em28xx_write_reg(dev,
|
|
|
|
|
+ EM28XX_R12_VINENABLE, 0x37);
|
|
|
|
|
|
|
|
- /* enable video capture */
|
|
|
|
|
- rc = em28xx_write_reg(dev, 0x48, 0x00);
|
|
|
|
|
|
|
+ msleep(6);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ /* disable video capture */
|
|
|
|
|
+ rc = em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x27);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (dev->mode == EM28XX_ANALOG_MODE)
|
|
|
|
|
- rc = em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x67);
|
|
|
|
|
- else
|
|
|
|
|
- rc = em28xx_write_reg(dev, EM28XX_R12_VINENABLE, 0x37);
|
|
|
|
|
|
|
+ if (rc < 0)
|
|
|
|
|
+ return rc;
|
|
|
|
|
|
|
|
- msleep(6);
|
|
|
|
|
|
|
+ /* Switch (explicitly controlled) analog capturing LED on/off */
|
|
|
|
|
+ if ((dev->mode == EM28XX_ANALOG_MODE)
|
|
|
|
|
+ && dev->board.analog_capturing_led) {
|
|
|
|
|
+ struct em28xx_led *led = dev->board.analog_capturing_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;
|
|
|
}
|
|
}
|