[PATCH v5 14/16] media: atomisp: Use struct v4l2_area for padding

From: Maurizio Casciano

Date: Mon Aug 31 2026 - 17:25:51 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>
Signed-off-by: Maurizio Casciano <mauriziocasciano7@xxxxxxxxx>
---
.../staging/media/atomisp/pci/atomisp_cmd.c | 68 +++++++++++--------
.../staging/media/atomisp/pci/atomisp_cmd.h | 6 +-
.../staging/media/atomisp/pci/atomisp_ioctl.c | 15 ++--
.../media/atomisp/pci/atomisp_subdev.c | 4 +-
.../media/atomisp/pci/atomisp_subdev.h | 3 +-
5 files changed, 53 insertions(+), 43 deletions(-)

diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 6cd500d9fd26..759effdb2e8d 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,18 @@ 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);
+}
+
+static inline void
+atomisp_get_pix_padding(struct atomisp_device *isp,
+ struct v4l2_pix_format *f,
+ struct v4l2_area *pad)
+{
+ struct v4l2_area size = { .width = f->width, .height = f->height };
+
+ atomisp_get_padding(isp, size, pad);
}

int atomisp_s_sensor_power(struct atomisp_device *isp, unsigned int input, bool on)
@@ -3800,7 +3811,7 @@ 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;
int ret;

fmt = atomisp_get_format_bridge(f->pixelformat);
@@ -3827,10 +3838,10 @@ 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);
+ atomisp_get_pix_padding(isp, f, &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 +3858,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
@@ -4268,11 +4279,12 @@ static int atomisp_set_fmt_to_snr(struct video_device *vdev, const struct v4l2_p
return -EINVAL;

v4l2_fill_mbus_format(&ffmt, f, format->mbus_code);
- ffmt.height += asd->sink_pad_padding_h + dvs_env_h;
- ffmt.width += asd->sink_pad_padding_w + dvs_env_w;
+ ffmt.height += asd->sink_pad_padding.height + dvs_env_h;
+ ffmt.width += asd->sink_pad_padding.width + dvs_env_w;

dev_dbg(isp->dev, "s_mbus_fmt: ask %ux%u (padding %ux%u, dvs %ux%u)\n",
- ffmt.width, ffmt.height, asd->sink_pad_padding_w, asd->sink_pad_padding_h,
+ ffmt.width, ffmt.height, asd->sink_pad_padding.width,
+ asd->sink_pad_padding.height,
dvs_env_w, dvs_env_h);

__atomisp_init_stream_info(ATOMISP_INPUT_STREAM_GENERAL, stream_info);
@@ -4365,13 +4377,11 @@ int atomisp_set_fmt(struct video_device *vdev, struct v4l2_format *f)
V4L2_SUBDEV_FORMAT_ACTIVE,
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);
- } else {
- asd->sink_pad_padding_w = 0;
- asd->sink_pad_padding_h = 0;
- }
+ if (atomisp_subdev_format_conversion(asd))
+ atomisp_get_pix_padding(isp, &f->fmt.pix,
+ &asd->sink_pad_padding);
+ else
+ asd->sink_pad_padding = (struct v4l2_area) { };

atomisp_get_dis_envelop(asd, f->fmt.pix.width, f->fmt.pix.height,
&dvs_env_w, &dvs_env_h);
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..87c29a940f9b 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
@@ -457,7 +457,7 @@ static int atomisp_enum_framesizes_crop_inner(struct atomisp_device *isp,
const struct v4l2_rect *native,
int *valid_sizes)
{
- static const struct v4l2_frmsize_discrete frame_sizes[] = {
+ static const struct v4l2_area frame_sizes[] = {
{ 1920, 1440 },
{ 1920, 1200 },
{ 1920, 1080 },
@@ -470,15 +470,15 @@ 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 padding;

- if ((frame_sizes[i].width + padding_w) > native->width ||
- (frame_sizes[i].height + padding_h) > native->height)
+ atomisp_get_padding(isp, frame_sizes[i], &padding);
+
+ if ((frame_sizes[i].width + padding.width) > native->width ||
+ (frame_sizes[i].height + padding.height) > native->height)
continue;

/*
@@ -491,7 +491,8 @@ static int atomisp_enum_framesizes_crop_inner(struct atomisp_device *isp,

if (*valid_sizes == fsize->index) {
fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
- fsize->discrete = frame_sizes[i];
+ fsize->discrete.width = frame_sizes[i].width;
+ fsize->discrete.height = frame_sizes[i].height;
return 0;
}

diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.c b/drivers/staging/media/atomisp/pci/atomisp_subdev.c
index 9de9cd884d99..ad97e4691d9a 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_subdev.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.c
@@ -326,8 +326,8 @@ int atomisp_subdev_set_selection(struct v4l2_subdev *sd,

if (atomisp_subdev_format_conversion(isp_sd)
&& crop[pad]->width && crop[pad]->height) {
- crop[pad]->width -= isp_sd->sink_pad_padding_w;
- crop[pad]->height -= isp_sd->sink_pad_padding_h;
+ crop[pad]->width -= isp_sd->sink_pad_padding.width;
+ crop[pad]->height -= isp_sd->sink_pad_padding.height;
}

if (isp_sd->params.video_dis_en &&
diff --git a/drivers/staging/media/atomisp/pci/atomisp_subdev.h b/drivers/staging/media/atomisp/pci/atomisp_subdev.h
index b12bb65be3f2..0045f380de74 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_subdev.h
+++ b/drivers/staging/media/atomisp/pci/atomisp_subdev.h
@@ -214,8 +214,7 @@ struct atomisp_sub_device {
struct media_pad pads[ATOMISP_SUBDEV_PADS_NUM];
struct atomisp_pad_format fmt[ATOMISP_SUBDEV_PADS_NUM];
/* Padding for currently set sink-pad fmt */
- u32 sink_pad_padding_w;
- u32 sink_pad_padding_h;
+ struct v4l2_area sink_pad_padding;

unsigned int output;
struct atomisp_video_pipe video_out;
--
With Best Regards,
Maurizio Casciano