OSDN Git Service

[media] tw9910: init priv->scale and update standard
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 15 Jun 2015 11:33:31 +0000 (08:33 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Tue, 11 Aug 2015 12:49:30 +0000 (09:49 -0300)
When the standard changes the VACTIVE and VDELAY values need to be updated.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/i2c/soc_camera/tw9910.c

index df66417..e939c24 100644 (file)
@@ -510,13 +510,39 @@ static int tw9910_s_std(struct v4l2_subdev *sd, v4l2_std_id norm)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct tw9910_priv *priv = to_tw9910(client);
+       const unsigned hact = 720;
+       const unsigned hdelay = 15;
+       unsigned vact;
+       unsigned vdelay;
+       int ret;
 
        if (!(norm & (V4L2_STD_NTSC | V4L2_STD_PAL)))
                return -EINVAL;
 
        priv->norm = norm;
+       if (norm & V4L2_STD_525_60) {
+               vact = 240;
+               vdelay = 18;
+               ret = tw9910_mask_set(client, VVBI, 0x10, 0x10);
+       } else {
+               vact = 288;
+               vdelay = 24;
+               ret = tw9910_mask_set(client, VVBI, 0x10, 0x00);
+       }
+       if (!ret)
+               ret = i2c_smbus_write_byte_data(client, CROP_HI,
+                       ((vdelay >> 2) & 0xc0) |
+                       ((vact >> 4) & 0x30) |
+                       ((hdelay >> 6) & 0x0c) |
+                       ((hact >> 8) & 0x03));
+       if (!ret)
+               ret = i2c_smbus_write_byte_data(client, VDELAY_LO,
+                       vdelay & 0xff);
+       if (!ret)
+               ret = i2c_smbus_write_byte_data(client, VACTIVE_LO,
+                       vact & 0xff);
 
-       return 0;
+       return ret;
 }
 
 #ifdef CONFIG_VIDEO_ADV_DEBUG
@@ -820,6 +846,7 @@ static int tw9910_video_probe(struct i2c_client *client)
                 "tw9910 Product ID %0x:%0x\n", id, priv->revision);
 
        priv->norm = V4L2_STD_NTSC;
+       priv->scale = &tw9910_ntsc_scales[0];
 
 done:
        tw9910_s_power(&priv->subdev, 0);