Commit d1dc6bac authored by Niklas Söderlund's avatar Niklas Söderlund Committed by Mauro Carvalho Chehab

media: rcar-vin: all Gen2 boards can scale simplify logic

The logic to preserve the requested format width and height are too
complex and come from a premature optimization for Gen3. All Gen2 SoC
can scale and the Gen3 implementation will not use these functions at
all so simply preserve the width and height when interacting with the
subdevice much like the field is preserved simplifies the logic quite a
bit.
Signed-off-by: default avatarNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 0f4b3378
...@@ -585,14 +585,6 @@ void rvin_crop_scale_comp(struct rvin_dev *vin) ...@@ -585,14 +585,6 @@ void rvin_crop_scale_comp(struct rvin_dev *vin)
0, 0); 0, 0);
} }
void rvin_scale_try(struct rvin_dev *vin, struct v4l2_pix_format *pix,
u32 width, u32 height)
{
/* All VIN channels on Gen2 have scalers */
pix->width = width;
pix->height = height;
}
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
* Hardware setup * Hardware setup
*/ */
......
...@@ -166,6 +166,7 @@ static int __rvin_try_format_source(struct rvin_dev *vin, ...@@ -166,6 +166,7 @@ static int __rvin_try_format_source(struct rvin_dev *vin,
.which = which, .which = which,
}; };
enum v4l2_field field; enum v4l2_field field;
u32 width, height;
int ret; int ret;
sd = vin_to_source(vin); sd = vin_to_source(vin);
...@@ -178,7 +179,10 @@ static int __rvin_try_format_source(struct rvin_dev *vin, ...@@ -178,7 +179,10 @@ static int __rvin_try_format_source(struct rvin_dev *vin,
format.pad = vin->digital->source_pad; format.pad = vin->digital->source_pad;
/* Allow the video device to override field and to scale */
field = pix->field; field = pix->field;
width = pix->width;
height = pix->height;
ret = v4l2_subdev_call(sd, pad, set_fmt, pad_cfg, &format); ret = v4l2_subdev_call(sd, pad, set_fmt, pad_cfg, &format);
if (ret < 0 && ret != -ENOIOCTLCMD) if (ret < 0 && ret != -ENOIOCTLCMD)
...@@ -186,11 +190,13 @@ static int __rvin_try_format_source(struct rvin_dev *vin, ...@@ -186,11 +190,13 @@ static int __rvin_try_format_source(struct rvin_dev *vin,
v4l2_fill_pix_format(pix, &format.format); v4l2_fill_pix_format(pix, &format.format);
pix->field = field;
source->width = pix->width; source->width = pix->width;
source->height = pix->height; source->height = pix->height;
pix->field = field;
pix->width = width;
pix->height = height;
vin_dbg(vin, "Source resolution: %ux%u\n", source->width, vin_dbg(vin, "Source resolution: %ux%u\n", source->width,
source->height); source->height);
...@@ -204,13 +210,9 @@ static int __rvin_try_format(struct rvin_dev *vin, ...@@ -204,13 +210,9 @@ static int __rvin_try_format(struct rvin_dev *vin,
struct v4l2_pix_format *pix, struct v4l2_pix_format *pix,
struct rvin_source_fmt *source) struct rvin_source_fmt *source)
{ {
u32 rwidth, rheight, walign; u32 walign;
int ret; int ret;
/* Requested */
rwidth = pix->width;
rheight = pix->height;
/* Keep current field if no specific one is asked for */ /* Keep current field if no specific one is asked for */
if (pix->field == V4L2_FIELD_ANY) if (pix->field == V4L2_FIELD_ANY)
pix->field = vin->format.field; pix->field = vin->format.field;
...@@ -248,10 +250,6 @@ static int __rvin_try_format(struct rvin_dev *vin, ...@@ -248,10 +250,6 @@ static int __rvin_try_format(struct rvin_dev *vin,
break; break;
} }
/* If source can't match format try if VIN can scale */
if (source->width != rwidth || source->height != rheight)
rvin_scale_try(vin, pix, rwidth, rheight);
/* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */ /* HW limit width to a multiple of 32 (2^5) for NV16 else 2 (2^1) */
walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1; walign = vin->format.pixelformat == V4L2_PIX_FMT_NV16 ? 5 : 1;
...@@ -270,9 +268,8 @@ static int __rvin_try_format(struct rvin_dev *vin, ...@@ -270,9 +268,8 @@ static int __rvin_try_format(struct rvin_dev *vin,
return -EINVAL; return -EINVAL;
} }
vin_dbg(vin, "Requested %ux%u Got %ux%u bpl: %d size: %d\n", vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n",
rwidth, rheight, pix->width, pix->height, pix->width, pix->height, pix->bytesperline, pix->sizeimage);
pix->bytesperline, pix->sizeimage);
return 0; return 0;
} }
......
...@@ -175,8 +175,6 @@ void rvin_v4l2_unregister(struct rvin_dev *vin); ...@@ -175,8 +175,6 @@ void rvin_v4l2_unregister(struct rvin_dev *vin);
const struct rvin_video_format *rvin_format_from_pixel(u32 pixelformat); const struct rvin_video_format *rvin_format_from_pixel(u32 pixelformat);
/* Cropping, composing and scaling */ /* Cropping, composing and scaling */
void rvin_scale_try(struct rvin_dev *vin, struct v4l2_pix_format *pix,
u32 width, u32 height);
void rvin_crop_scale_comp(struct rvin_dev *vin); void rvin_crop_scale_comp(struct rvin_dev *vin);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment