summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/em28xx/em28xx-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/video/em28xx/em28xx-core.c')
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-core.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/linux/drivers/media/video/em28xx/em28xx-core.c b/linux/drivers/media/video/em28xx/em28xx-core.c
index 420e343f2..46cb13182 100644
--- a/linux/drivers/media/video/em28xx/em28xx-core.c
+++ b/linux/drivers/media/video/em28xx/em28xx-core.c
@@ -494,7 +494,7 @@ int em28xx_audio_setup(struct em28xx *dev)
/* If device doesn't support Usb Audio Class, use vendor class */
if (!dev->has_audio_class)
- dev->has_alsa_audio = 1;
+ dev->has_alsa_audio = ~dev->board.no_audio;
dev->audio_mode.has_audio = 1;
@@ -632,6 +632,9 @@ int em28xx_capture_start(struct em28xx *dev, int start)
return rc;
}
+ if (dev->board.is_webcam)
+ rc = em28xx_write_reg(dev, 0x13, 0x0c);
+
/* enable video capture */
rc = em28xx_write_reg(dev, 0x48, 0x00);
@@ -648,28 +651,17 @@ int em28xx_capture_start(struct em28xx *dev, int start)
int em28xx_set_outfmt(struct em28xx *dev)
{
int ret;
- int vinmode, vinctl, outfmt;
-
- outfmt = dev->format->reg;
-
- if (dev->board.is_webcam) {
- vinmode = 0x0d;
- vinctl = 0x00;
- } else {
- vinmode = 0x10;
- vinctl = 0x11;
- }
ret = em28xx_write_reg_bits(dev, EM28XX_R27_OUTFMT,
- outfmt | 0x20, 0xff);
+ dev->format->reg | 0x20, 0xff);
if (ret < 0)
return ret;
- ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, vinmode);
+ ret = em28xx_write_reg(dev, EM28XX_R10_VINMODE, dev->vinmode);
if (ret < 0)
return ret;
- return em28xx_write_reg(dev, EM28XX_R11_VINCTRL, vinctl);
+ return em28xx_write_reg(dev, EM28XX_R11_VINCTRL, dev->vinctl);
}
static int em28xx_accumulator_set(struct em28xx *dev, u8 xmin, u8 xmax,
@@ -707,10 +699,7 @@ static int em28xx_scaler_set(struct em28xx *dev, u16 h, u16 v)
u8 mode;
/* the em2800 scaler only supports scaling down to 50% */
- if (dev->board.is_webcam) {
- /* FIXME: Don't use the scaler yet */
- mode = 0;
- } else if (dev->board.is_em2800) {
+ if (dev->board.is_em2800) {
mode = (v ? 0x20 : 0x00) | (h ? 0x10 : 0x00);
} else {
u8 buf[2];
@@ -734,7 +723,10 @@ int em28xx_resolution_set(struct em28xx *dev)
{
int width, height;
width = norm_maxw(dev);
- height = norm_maxh(dev) >> 1;
+ height = norm_maxh(dev);
+
+ if (!dev->progressive)
+ height >>= norm_maxh(dev);
em28xx_set_outfmt(dev);