V4L/DVB (12243): em28xx: allow specifying sensor xtal frequency
authorMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 14 Jul 2009 06:18:39 +0000 (03:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 24 Jul 2009 17:03:26 +0000 (14:03 -0300)
In order to properly estimate fps, mt9v011 sensor driver needs to know
what is the used frequency on the sensor cristal. Adds the proper fields
and initialization code for specifying the cristal frequency.

Also, based on experimentation, it was noticed that the Silvercrest is
outputing data at 7 fps. This means that it should be using a 6.3 MHz
cristal. This information needs to be double checked later, by opening
the device. Anyway, by using this value for xtal, at least now we have
the correct fps report.

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

index d4a7e6075cc94faf30e7bc43ecdb28f5a9aa9d4a..82536dd6b0fdb933e7945603730856d2a2e47605 100644 (file)
@@ -1734,6 +1734,7 @@ static int em28xx_hint_sensor(struct em28xx *dev)
                dev->em28xx_sensor = EM28XX_MT9V011;
                dev->sensor_xres = 640;
                dev->sensor_yres = 480;
+               dev->sensor_xtal = 6300000;
                break;
        default:
                printk("Unknown Micron Sensor 0x%04x\n", be16_to_cpu(version));
@@ -2261,9 +2262,13 @@ void em28xx_card_setup(struct em28xx *dev)
                v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                        "tvp5150", "tvp5150", tvp5150_addrs);
 
-       if (dev->em28xx_sensor == EM28XX_MT9V011)
-               v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
-                       "mt9v011", "mt9v011", mt9v011_addrs);
+       if (dev->em28xx_sensor == EM28XX_MT9V011) {
+               struct v4l2_subdev *sd;
+
+               sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
+                        &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs);
+               v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal);
+       }
 
        if (dev->board.adecoder == EM28XX_TVAUDIO)
                v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
index 71444ddbe40c0afcdf6c4f7e74eed23f9de9ac34..ce76633786c8d6318b0cc5c7c213c5a6075c7679 100644 (file)
@@ -478,8 +478,10 @@ struct em28xx {
        struct v4l2_device v4l2_dev;
        struct em28xx_board board;
 
+       /* Webcam specific fields */
        enum em28xx_sensor em28xx_sensor;
        int sensor_xres, sensor_yres;
+       int sensor_xtal;
 
        unsigned int stream_on:1;       /* Locks streams */
        unsigned int has_audio_class:1;