V4L/DVB (12244): em28xx: adjust vinmode/vinctl based on the stream input format
authorMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 14 Jul 2009 15:33:25 +0000 (12:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 24 Jul 2009 17:03:26 +0000 (14:03 -0300)
Depending on the video input format, vinmode/vinctl needs adjustments.
For TV, this is not relevant, since the supported decoders output data
at the same format. However, webcam sensors may have different formats,
so, this needs to be adjusted based on the device.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx.h

index 82536dd6b0fdb933e7945603730856d2a2e47605..e793aee16726add9ddeafca352bdfacd40ab0dd8 100644 (file)
@@ -1735,6 +1735,11 @@ static int em28xx_hint_sensor(struct em28xx *dev)
                dev->sensor_xres = 640;
                dev->sensor_yres = 480;
                dev->sensor_xtal = 6300000;
+
+               /* probably means GRGB 16 bit bayer */
+               dev->vinmode = 0x0d;
+               dev->vinctl = 0x00;
+
                break;
        default:
                printk("Unknown Micron Sensor 0x%04x\n", be16_to_cpu(version));
@@ -2414,6 +2419,12 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
                return errCode;
        }
 
+       /*
+        * Default format, used for tvp5150 or saa711x output formats
+        */
+       dev->vinmode = 0x10;
+       dev->vinctl  = 0x11;
+
        /*
         * If the device can be a webcam, seek for a sensor.
         * If sensor is not found, then it isn't a webcam.
index c7fcce7139458ca8596a4427c4f85ea04b38d72b..5b78e199abd1ac9bbf433dba0012eafe02b0ab46 100644 (file)
@@ -648,28 +648,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,
index ce76633786c8d6318b0cc5c7c213c5a6075c7679..766ab59b8d599d924446be5b0102b75446cd51f4 100644 (file)
@@ -483,6 +483,9 @@ struct em28xx {
        int sensor_xres, sensor_yres;
        int sensor_xtal;
 
+       /* Vinmode/Vinctl used at the driver */
+       int vinmode, vinctl;
+
        unsigned int stream_on:1;       /* Locks streams */
        unsigned int has_audio_class:1;
        unsigned int has_alsa_audio:1;