aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/platform
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>2016-09-02 12:45:00 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-09-19 15:33:07 -0400
commitc6b3d8fc79a93aa1139c080bbb7402db846cc9f7 (patch)
treeb43d85b977b3258ab98ea335dc9b257d006d35b3 /drivers/media/platform
parentd6482537f666ab024925e5a126cfaeede34a3801 (diff)
[media] media: rcar-vin: fix height for TOP and BOTTOM fields
The height used for V4L2_FIELD_TOP and V4L2_FIELD_BOTTOM where wrong. The frames only contain one field so the height should be half of the frame. 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@s-opensource.com>
Diffstat (limited to 'drivers/media/platform')
-rw-r--r--drivers/media/platform/rcar-vin/rcar-v4l2.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c
index 47d8d9745747..1392514d4072 100644
--- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
+++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
@@ -125,6 +125,8 @@ static int rvin_reset_format(struct rvin_dev *vin)
125 switch (vin->format.field) { 125 switch (vin->format.field) {
126 case V4L2_FIELD_TOP: 126 case V4L2_FIELD_TOP:
127 case V4L2_FIELD_BOTTOM: 127 case V4L2_FIELD_BOTTOM:
128 vin->format.height /= 2;
129 break;
128 case V4L2_FIELD_NONE: 130 case V4L2_FIELD_NONE:
129 case V4L2_FIELD_INTERLACED_TB: 131 case V4L2_FIELD_INTERLACED_TB:
130 case V4L2_FIELD_INTERLACED_BT: 132 case V4L2_FIELD_INTERLACED_BT:
@@ -220,21 +222,13 @@ static int __rvin_try_format(struct rvin_dev *vin,
220 /* Limit to source capabilities */ 222 /* Limit to source capabilities */
221 __rvin_try_format_source(vin, which, pix, source); 223 __rvin_try_format_source(vin, which, pix, source);
222 224
223 /* If source can't match format try if VIN can scale */
224 if (source->width != rwidth || source->height != rheight)
225 rvin_scale_try(vin, pix, rwidth, rheight);
226
227 /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
228 walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
229
230 /* Limit to VIN capabilities */
231 v4l_bound_align_image(&pix->width, 2, RVIN_MAX_WIDTH, walign,
232 &pix->height, 4, RVIN_MAX_HEIGHT, 2, 0);
233
234 switch (pix->field) { 225 switch (pix->field) {
235 case V4L2_FIELD_NONE:
236 case V4L2_FIELD_TOP: 226 case V4L2_FIELD_TOP:
237 case V4L2_FIELD_BOTTOM: 227 case V4L2_FIELD_BOTTOM:
228 pix->height /= 2;
229 source->height /= 2;
230 break;
231 case V4L2_FIELD_NONE:
238 case V4L2_FIELD_INTERLACED_TB: 232 case V4L2_FIELD_INTERLACED_TB:
239 case V4L2_FIELD_INTERLACED_BT: 233 case V4L2_FIELD_INTERLACED_BT:
240 case V4L2_FIELD_INTERLACED: 234 case V4L2_FIELD_INTERLACED:
@@ -244,6 +238,17 @@ static int __rvin_try_format(struct rvin_dev *vin,
244 break; 238 break;
245 } 239 }
246 240
241 /* If source can't match format try if VIN can scale */
242 if (source->width != rwidth || source->height != rheight)
243 rvin_scale_try(vin, pix, rwidth, rheight);
244
245 /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
246 walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
247
248 /* Limit to VIN capabilities */
249 v4l_bound_align_image(&pix->width, 2, RVIN_MAX_WIDTH, walign,
250 &pix->height, 4, RVIN_MAX_HEIGHT, 2, 0);
251
247 pix->bytesperline = max_t(u32, pix->bytesperline, 252 pix->bytesperline = max_t(u32, pix->bytesperline,
248 rvin_format_bytesperline(pix)); 253 rvin_format_bytesperline(pix));
249 pix->sizeimage = max_t(u32, pix->sizeimage, 254 pix->sizeimage = max_t(u32, pix->sizeimage,