[PATCH v4 13/15] media: atomisp: Use struct v4l2_area for padding
From: Maurizio Casciano
Date: Fri Aug 28 2026 - 12:18:25 EST
The padding helper passes width and height as four separate scalar
arguments even though they form two logical dimensions.
Pass the requested size and returned padding as struct v4l2_area values.
This makes the dimensions explicit and simplifies all three callers.
Suggested-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxx>
Link: https://lore.kernel.org/linux-media/apCc_pt5dDxGJrei@ashevche-desk.local/
Signed-off-by: Maurizio Casciano <mauriziocasciano7@xxxxxxxxx>
---
.../staging/media/atomisp/pci/atomisp_cmd.c | 51 +++++++++++--------
.../staging/media/atomisp/pci/atomisp_cmd.h | 6 +--
.../staging/media/atomisp/pci/atomisp_ioctl.c | 14 +++--
3 files changed, 42 insertions(+), 29 deletions(-)
diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 6cd500d9fd26..51dd59d98b3b 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -3562,9 +3562,9 @@ static void atomisp_fill_pix_format(struct v4l2_pix_format *f,
f->xfer_func = V4L2_XFER_FUNC_709;
}
-/* Get sensor padding values for the non padded width x height resolution */
-void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
- u32 *padding_w, u32 *padding_h)
+/* Get sensor padding values for the non-padded size */
+void atomisp_get_padding(struct atomisp_device *isp, struct v4l2_area size,
+ struct v4l2_area *pad)
{
struct atomisp_input_subdev *input = &isp->inputs[isp->asd.input_curr];
struct v4l2_rect native_rect = input->native_rect;
@@ -3574,22 +3574,23 @@ void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
struct v4l2_mbus_framefmt *sink;
if (!input->crop_support) {
- *padding_w = pad_w;
- *padding_h = pad_h;
+ pad->width = pad_w;
+ pad->height = pad_h;
return;
}
- width = min(width, input->active_rect.width);
- height = min(height, input->active_rect.height);
+ size.width = min(size.width, input->active_rect.width);
+ size.height = min(size.height, input->active_rect.height);
- if (input->binning_support && width <= (input->active_rect.width / 2) &&
- height <= (input->active_rect.height / 2)) {
+ if (input->binning_support &&
+ size.width <= (input->active_rect.width / 2) &&
+ size.height <= (input->active_rect.height / 2)) {
native_rect.width /= 2;
native_rect.height /= 2;
}
- *padding_w = min_t(u32, (native_rect.width - width) & ~1, pad_w);
- *padding_h = min_t(u32, (native_rect.height - height) & ~1, pad_h);
+ pad->width = min_t(u32, (native_rect.width - size.width) & ~1, pad_w);
+ pad->height = min_t(u32, (native_rect.height - size.height) & ~1, pad_h);
/* The below minimum padding requirements are for BYT / ISP2400 only */
if (IS_ISP2401)
@@ -3617,8 +3618,8 @@ void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
min_pad_h += 2;
apply_min_padding:
- *padding_w = max_t(u32, *padding_w, min_pad_w);
- *padding_h = max_t(u32, *padding_h, min_pad_h);
+ pad->width = max_t(u32, pad->width, min_pad_w);
+ pad->height = max_t(u32, pad->height, min_pad_h);
}
int atomisp_s_sensor_power(struct atomisp_device *isp, unsigned int input, bool on)
@@ -3800,7 +3801,8 @@ int atomisp_try_fmt(struct atomisp_device *isp, struct v4l2_pix_format *f,
const struct atomisp_format_bridge *fmt, *snr_fmt;
struct atomisp_sub_device *asd = &isp->asd;
struct v4l2_mbus_framefmt ffmt = { };
- u32 padding_w, padding_h;
+ struct v4l2_area padding;
+ struct v4l2_area size;
int ret;
fmt = atomisp_get_format_bridge(f->pixelformat);
@@ -3827,10 +3829,12 @@ int atomisp_try_fmt(struct atomisp_device *isp, struct v4l2_pix_format *f,
* resolution + padding. Add padding here and remove it again after
* the set_fmt call, like atomisp_set_fmt_to_snr() does.
*/
- atomisp_get_padding(isp, f->width, f->height, &padding_w, &padding_h);
+ size.width = f->width;
+ size.height = f->height;
+ atomisp_get_padding(isp, size, &padding);
v4l2_fill_mbus_format(&ffmt, f, fmt->mbus_code);
- ffmt.width += padding_w;
- ffmt.height += padding_h;
+ ffmt.width += padding.width;
+ ffmt.height += padding.height;
dev_dbg(isp->dev, "try_mbus_fmt: try %ux%u\n", ffmt.width, ffmt.height);
@@ -3847,8 +3851,8 @@ int atomisp_try_fmt(struct atomisp_device *isp, struct v4l2_pix_format *f,
return -EINVAL;
}
- f->width = ffmt.width - padding_w;
- f->height = ffmt.height - padding_h;
+ f->width = ffmt.width - padding.width;
+ f->height = ffmt.height - padding.height;
/*
* If the format is jpeg or custom RAW, then the width and height will
@@ -4334,6 +4338,8 @@ int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f)
const struct atomisp_format_bridge *format_bridge;
const struct atomisp_format_bridge *snr_format_bridge;
struct ia_css_frame_info output_info;
+ struct v4l2_area padding;
+ struct v4l2_area size;
unsigned int dvs_env_w = 0, dvs_env_h = 0;
struct v4l2_mbus_framefmt isp_source_fmt = {0};
struct v4l2_rect isp_sink_crop;
@@ -4366,8 +4372,11 @@ int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f)
ATOMISP_SUBDEV_PAD_SOURCE, &isp_source_fmt);
if (atomisp_subdev_format_conversion(asd)) {
- atomisp_get_padding(isp, f->fmt.pix.width, f->fmt.pix.height,
- &asd->sink_pad_padding_w, &asd->sink_pad_padding_h);
+ size.width = f->fmt.pix.width;
+ size.height = f->fmt.pix.height;
+ atomisp_get_padding(isp, size, &padding);
+ asd->sink_pad_padding_w = padding.width;
+ asd->sink_pad_padding_h = padding.height;
} else {
asd->sink_pad_padding_w = 0;
asd->sink_pad_padding_h = 0;
diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.h b/drivers/staging/media/atomisp/pci/atomisp_cmd.h
index d3d1f2574e77..8a84e774f4d5 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.h
@@ -225,9 +225,9 @@ int atomisp_makeup_css_parameters(struct atomisp_sub_device *asd,
int atomisp_compare_grid(struct atomisp_sub_device *asd,
struct atomisp_grid_info *atomgrid);
-/* Get sensor padding values for the non padded width x height resolution */
-void atomisp_get_padding(struct atomisp_device *isp, u32 width, u32 height,
- u32 *padding_w, u32 *padding_h);
+/* Get sensor padding values for the non-padded size */
+void atomisp_get_padding(struct atomisp_device *isp, struct v4l2_area size,
+ struct v4l2_area *pad);
/* Set sensor power (no-op if already on/off) */
int atomisp_s_sensor_power(struct atomisp_device *isp, unsigned int input, bool on);
diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
index 50366bf10f32..43bca68d1e6d 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
@@ -470,15 +470,19 @@ static int atomisp_enum_framesizes_crop_inner(struct atomisp_device *isp,
{ 800, 600 },
{ 640, 480 },
};
- u32 padding_w, padding_h;
int i;
for (i = 0; i < ARRAY_SIZE(frame_sizes); i++) {
- atomisp_get_padding(isp, frame_sizes[i].width, frame_sizes[i].height,
- &padding_w, &padding_h);
+ struct v4l2_area size = {
+ .width = frame_sizes[i].width,
+ .height = frame_sizes[i].height,
+ };
+ struct v4l2_area padding;
- if ((frame_sizes[i].width + padding_w) > native->width ||
- (frame_sizes[i].height + padding_h) > native->height)
+ atomisp_get_padding(isp, size, &padding);
+
+ if ((frame_sizes[i].width + padding.width) > native->width ||
+ (frame_sizes[i].height + padding.height) > native->height)
continue;
/*
--
2.53.0