OSDN Git Service

media: adv7180: fix field type to V4L2_FIELD_ALTERNATE
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Thu, 26 Jul 2018 10:27:15 +0000 (06:27 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 27 Jul 2018 11:54:32 +0000 (07:54 -0400)
The ADV7180 and ADV7182 transmit whole fields, bottom field followed
by top (or vice-versa, depending on detected video standard). So
for chips that do not have support for explicitly setting the field
mode via I2P, set the field mode to V4L2_FIELD_ALTERNATE.

I2P converts fields into frames using an edge adaptive algorithm. The
frame rate is the same as the 'field rate': e.g. X fields per second
are now X frames per second.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/adv7180.c

index a727d7f..5a2751a 100644 (file)
@@ -644,6 +644,9 @@ static int adv7180_mbus_fmt(struct v4l2_subdev *sd,
        fmt->width = 720;
        fmt->height = state->curr_norm & V4L2_STD_525_60 ? 480 : 576;
 
+       if (state->field == V4L2_FIELD_ALTERNATE)
+               fmt->height /= 2;
+
        return 0;
 }
 
@@ -711,11 +714,11 @@ static int adv7180_set_pad_format(struct v4l2_subdev *sd,
 
        switch (format->format.field) {
        case V4L2_FIELD_NONE:
-               if (!(state->chip_info->flags & ADV7180_FLAG_I2P))
-                       format->format.field = V4L2_FIELD_INTERLACED;
-               break;
+               if (state->chip_info->flags & ADV7180_FLAG_I2P)
+                       break;
+               /* fall through */
        default:
-               format->format.field = V4L2_FIELD_INTERLACED;
+               format->format.field = V4L2_FIELD_ALTERNATE;
                break;
        }
 
@@ -1291,7 +1294,7 @@ static int adv7180_probe(struct i2c_client *client,
                return -ENOMEM;
 
        state->client = client;
-       state->field = V4L2_FIELD_INTERLACED;
+       state->field = V4L2_FIELD_ALTERNATE;
        state->chip_info = (struct adv7180_chip_info *)id->driver_data;
 
        state->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "powerdown",