From: Fabio Estevam <festevam@xxxxxxx> v4l_bound_align_image() aligns to a multiple power of 2 of walign, but the result only needs to be a multiple of walign. This causes a 640x480 sensor that used to report: Width/Height : 640/480 to incorrectly report: Width/Height : 768/480 Fix this problem by doing the correct alignment via clamp_roundup(). Reported-by: Tim Harvey <tharvey@xxxxxxxxxxxxx> Fixes: 6f482c4729d9 ("media: imx: imx7-media-csi: Get rid of superfluous call to imx7_csi_mbus_fmt_to_pix_fmt") Co-developed-by: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx> Signed-off-by: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx> Signed-off-by: Fabio Estevam <festevam@xxxxxxx> --- Changes since v1: - Export clamp_roundup(). drivers/media/platform/nxp/imx7-media-csi.c | 4 ++-- drivers/media/v4l2-core/v4l2-common.c | 5 +++-- include/media/v4l2-common.h | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/nxp/imx7-media-csi.c b/drivers/media/platform/nxp/imx7-media-csi.c index 0bd2613b9320..f3c506fc19c4 100644 --- a/drivers/media/platform/nxp/imx7-media-csi.c +++ b/drivers/media/platform/nxp/imx7-media-csi.c @@ -1137,8 +1137,8 @@ __imx7_csi_video_try_fmt(struct v4l2_pix_format *pixfmt, * TODO: Implement configurable stride support. */ walign = 8 * 8 / cc->bpp; - v4l_bound_align_image(&pixfmt->width, 1, 0xffff, walign, - &pixfmt->height, 1, 0xffff, 1, 0); + pixfmt->width = clamp_roundup(pixfmt->width, 1, 0xffff, walign); + pixfmt->height = clamp_roundup(pixfmt->height, 1, 0xffff, 1); pixfmt->bytesperline = pixfmt->width * cc->bpp / 8; pixfmt->sizeimage = pixfmt->bytesperline * pixfmt->height; diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c index bee1535b04d3..3e8c16bcb0f6 100644 --- a/drivers/media/v4l2-core/v4l2-common.c +++ b/drivers/media/v4l2-core/v4l2-common.c @@ -106,8 +106,8 @@ static unsigned int clamp_align(unsigned int x, unsigned int min, return x; } -static unsigned int clamp_roundup(unsigned int x, unsigned int min, - unsigned int max, unsigned int alignment) +unsigned int clamp_roundup(unsigned int x, unsigned int min, + unsigned int max, unsigned int alignment) { x = clamp(x, min, max); if (alignment) @@ -115,6 +115,7 @@ static unsigned int clamp_roundup(unsigned int x, unsigned int min, return x; } +EXPORT_SYMBOL(clamp_roundup); void v4l_bound_align_image(u32 *w, unsigned int wmin, unsigned int wmax, unsigned int walign, diff --git a/include/media/v4l2-common.h b/include/media/v4l2-common.h index d278836fd9cb..7059b99f4afa 100644 --- a/include/media/v4l2-common.h +++ b/include/media/v4l2-common.h @@ -521,6 +521,8 @@ int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat, u32 width, u32 height); int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat, u32 width, u32 height); +unsigned int clamp_roundup(unsigned int x, unsigned int min, + unsigned int max, unsigned int alignment); /** * v4l2_get_link_freq - Get link rate from transmitter -- 2.34.1