Message ID | 20180129163435.24936-16-niklas.soderlund+renesas@ragnatech.se (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Niklas, Thank you for the patch. On Monday, 29 January 2018 18:34:20 EET Niklas Söderlund wrote: > Part of the format alignment and checking can be shared with the Gen3 > format handling. Break that part out to a separate function. > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > --- > drivers/media/platform/rcar-vin/rcar-v4l2.c | 93 +++++++++++++----------- > 1 file changed, 50 insertions(+), 43 deletions(-) > > diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c > b/drivers/media/platform/rcar-vin/rcar-v4l2.c index > c606942e59b5d934..1169e6a279ecfb55 100644 > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c > @@ -86,6 +86,55 @@ static u32 rvin_format_sizeimage(struct v4l2_pix_format > *pix) return pix->bytesperline * pix->height; > } > > +static int rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format > *pix) > +{ > + u32 walign; > + > + /* If requested format is not supported fallback to the default */ > + if (!rvin_format_from_pixel(pix->pixelformat)) { > + vin_dbg(vin, "Format 0x%x not found, using default 0x%x\n", > + pix->pixelformat, RVIN_DEFAULT_FORMAT); I think you can drop the message. > + pix->pixelformat = RVIN_DEFAULT_FORMAT; > + } > + > + /* Reject ALTERNATE until support is added to the driver */ > + switch (pix->field) { > + case V4L2_FIELD_TOP: > + case V4L2_FIELD_BOTTOM: > + case V4L2_FIELD_NONE: > + case V4L2_FIELD_INTERLACED_TB: > + case V4L2_FIELD_INTERLACED_BT: > + case V4L2_FIELD_INTERLACED: > + break; > + default: > + pix->field = V4L2_FIELD_NONE; > + break; > + } > + > + /* 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; > + > + /* Limit to VIN capabilities */ > + v4l_bound_align_image(&pix->width, 2, vin->info->max_width, walign, > + &pix->height, 4, vin->info->max_height, 2, 0); > + > + pix->bytesperline = max_t(u32, pix->bytesperline, > + rvin_format_bytesperline(pix)); > + pix->sizeimage = max_t(u32, pix->sizeimage, > + rvin_format_sizeimage(pix)); > + > + if (vin->info->model == RCAR_M1 && > + pix->pixelformat == V4L2_PIX_FMT_XBGR32) { > + vin_err(vin, "pixel format XBGR32 not supported on M1\n"); > + return -EINVAL; This shouldn't print a message nor return an error, but default to a supported format. You can move the check to the beginning of the function to do so. > + } > + > + vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n", > + pix->width, pix->height, pix->bytesperline, pix->sizeimage); > + > + return 0; > +} > + > /* > --------------------------------------------------------------------------- > -- * V4L2 > */ > @@ -215,19 +264,12 @@ static int __rvin_try_format_source(struct rvin_dev > *vin, static int __rvin_try_format(struct rvin_dev *vin, > u32 which, struct v4l2_pix_format *pix) > { > - u32 walign; > int ret; > > /* Keep current field if no specific one is asked for */ > if (pix->field == V4L2_FIELD_ANY) > pix->field = vin->format.field; > > - /* If requested format is not supported fallback to the default */ > - if (!rvin_format_from_pixel(pix->pixelformat)) { > - vin_dbg(vin, "Format 0x%x not found, using default 0x%x\n", > - pix->pixelformat, RVIN_DEFAULT_FORMAT); > - pix->pixelformat = RVIN_DEFAULT_FORMAT; > - } > > /* Always recalculate */ > pix->bytesperline = 0; > @@ -238,42 +280,7 @@ static int __rvin_try_format(struct rvin_dev *vin, > if (ret) > return ret; > > - /* Reject ALTERNATE until support is added to the driver */ > - switch (pix->field) { > - case V4L2_FIELD_TOP: > - case V4L2_FIELD_BOTTOM: > - case V4L2_FIELD_NONE: > - case V4L2_FIELD_INTERLACED_TB: > - case V4L2_FIELD_INTERLACED_BT: > - case V4L2_FIELD_INTERLACED: > - break; > - default: > - pix->field = V4L2_FIELD_NONE; > - break; > - } > - > - /* 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; > - > - /* Limit to VIN capabilities */ > - v4l_bound_align_image(&pix->width, 2, vin->info->max_width, walign, > - &pix->height, 4, vin->info->max_height, 2, 0); > - > - pix->bytesperline = max_t(u32, pix->bytesperline, > - rvin_format_bytesperline(pix)); > - pix->sizeimage = max_t(u32, pix->sizeimage, > - rvin_format_sizeimage(pix)); > - > - if (vin->info->model == RCAR_M1 && > - pix->pixelformat == V4L2_PIX_FMT_XBGR32) { > - vin_err(vin, "pixel format XBGR32 not supported on M1\n"); > - return -EINVAL; > - } > - > - vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n", > - pix->width, pix->height, pix->bytesperline, pix->sizeimage); > - > - return 0; > + return rvin_format_align(vin, pix); > } > > static int rvin_querycap(struct file *file, void *priv,
diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c index c606942e59b5d934..1169e6a279ecfb55 100644 --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c @@ -86,6 +86,55 @@ static u32 rvin_format_sizeimage(struct v4l2_pix_format *pix) return pix->bytesperline * pix->height; } +static int rvin_format_align(struct rvin_dev *vin, struct v4l2_pix_format *pix) +{ + u32 walign; + + /* If requested format is not supported fallback to the default */ + if (!rvin_format_from_pixel(pix->pixelformat)) { + vin_dbg(vin, "Format 0x%x not found, using default 0x%x\n", + pix->pixelformat, RVIN_DEFAULT_FORMAT); + pix->pixelformat = RVIN_DEFAULT_FORMAT; + } + + /* Reject ALTERNATE until support is added to the driver */ + switch (pix->field) { + case V4L2_FIELD_TOP: + case V4L2_FIELD_BOTTOM: + case V4L2_FIELD_NONE: + case V4L2_FIELD_INTERLACED_TB: + case V4L2_FIELD_INTERLACED_BT: + case V4L2_FIELD_INTERLACED: + break; + default: + pix->field = V4L2_FIELD_NONE; + break; + } + + /* 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; + + /* Limit to VIN capabilities */ + v4l_bound_align_image(&pix->width, 2, vin->info->max_width, walign, + &pix->height, 4, vin->info->max_height, 2, 0); + + pix->bytesperline = max_t(u32, pix->bytesperline, + rvin_format_bytesperline(pix)); + pix->sizeimage = max_t(u32, pix->sizeimage, + rvin_format_sizeimage(pix)); + + if (vin->info->model == RCAR_M1 && + pix->pixelformat == V4L2_PIX_FMT_XBGR32) { + vin_err(vin, "pixel format XBGR32 not supported on M1\n"); + return -EINVAL; + } + + vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n", + pix->width, pix->height, pix->bytesperline, pix->sizeimage); + + return 0; +} + /* ----------------------------------------------------------------------------- * V4L2 */ @@ -215,19 +264,12 @@ static int __rvin_try_format_source(struct rvin_dev *vin, static int __rvin_try_format(struct rvin_dev *vin, u32 which, struct v4l2_pix_format *pix) { - u32 walign; int ret; /* Keep current field if no specific one is asked for */ if (pix->field == V4L2_FIELD_ANY) pix->field = vin->format.field; - /* If requested format is not supported fallback to the default */ - if (!rvin_format_from_pixel(pix->pixelformat)) { - vin_dbg(vin, "Format 0x%x not found, using default 0x%x\n", - pix->pixelformat, RVIN_DEFAULT_FORMAT); - pix->pixelformat = RVIN_DEFAULT_FORMAT; - } /* Always recalculate */ pix->bytesperline = 0; @@ -238,42 +280,7 @@ static int __rvin_try_format(struct rvin_dev *vin, if (ret) return ret; - /* Reject ALTERNATE until support is added to the driver */ - switch (pix->field) { - case V4L2_FIELD_TOP: - case V4L2_FIELD_BOTTOM: - case V4L2_FIELD_NONE: - case V4L2_FIELD_INTERLACED_TB: - case V4L2_FIELD_INTERLACED_BT: - case V4L2_FIELD_INTERLACED: - break; - default: - pix->field = V4L2_FIELD_NONE; - break; - } - - /* 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; - - /* Limit to VIN capabilities */ - v4l_bound_align_image(&pix->width, 2, vin->info->max_width, walign, - &pix->height, 4, vin->info->max_height, 2, 0); - - pix->bytesperline = max_t(u32, pix->bytesperline, - rvin_format_bytesperline(pix)); - pix->sizeimage = max_t(u32, pix->sizeimage, - rvin_format_sizeimage(pix)); - - if (vin->info->model == RCAR_M1 && - pix->pixelformat == V4L2_PIX_FMT_XBGR32) { - vin_err(vin, "pixel format XBGR32 not supported on M1\n"); - return -EINVAL; - } - - vin_dbg(vin, "Format %ux%u bpl: %d size: %d\n", - pix->width, pix->height, pix->bytesperline, pix->sizeimage); - - return 0; + return rvin_format_align(vin, pix); } static int rvin_querycap(struct file *file, void *priv,
Part of the format alignment and checking can be shared with the Gen3 format handling. Break that part out to a separate function. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> --- drivers/media/platform/rcar-vin/rcar-v4l2.c | 93 ++++++++++++++++------------- 1 file changed, 50 insertions(+), 43 deletions(-)