media: renesas: vsp1: Get configuration from partition instead of state
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Mon, 13 Nov 2023 22:53:07 +0000 (00:53 +0200)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 19 Jun 2024 22:36:48 +0000 (01:36 +0300)
Entities access various piece of information from the subdev state when
configuring a partition. The same data is available through the
partition structure passed to the .configure_partition() operation. Use
it to avoid accessing the state, which will simplify moving to the V4L2
subdev active state API.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
drivers/media/platform/renesas/vsp1/vsp1_rpf.c
drivers/media/platform/renesas/vsp1/vsp1_uds.c
drivers/media/platform/renesas/vsp1/vsp1_wpf.c

index 862751616646d683e2150ae68b86493a50b06a5d..b4558670b46fdd9a8738e8b3c2ca104a26e7433b 100644 (file)
@@ -289,7 +289,7 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
        struct vsp1_device *vsp1 = rpf->entity.vsp1;
        const struct vsp1_format_info *fmtinfo = rpf->fmtinfo;
        const struct v4l2_pix_format_mplane *format = &rpf->format;
-       struct v4l2_rect crop;
+       struct v4l2_rect crop = partition->rpf[rpf->entity.index];
 
        /*
         * Source size and crop offsets.
@@ -299,22 +299,6 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
         * offsets are needed, as planes 2 and 3 always have identical
         * strides.
         */
-       crop = *v4l2_subdev_state_get_crop(rpf->entity.state, RWPF_PAD_SINK);
-
-       /*
-        * Partition Algorithm Control
-        *
-        * The partition algorithm can split this frame into multiple
-        * slices. We must scale our partition window based on the pipe
-        * configuration to match the destination partition window.
-        * To achieve this, we adjust our crop to provide a 'sub-crop'
-        * matching the expected partition window. Only 'left' and
-        * 'width' need to be adjusted.
-        */
-       if (pipe->partitions > 1) {
-               crop.width = partition->rpf[rpf->entity.index].width;
-               crop.left += partition->rpf[rpf->entity.index].left;
-       }
 
        if (pipe->interlaced) {
                crop.height = round_down(crop.height / 2, fmtinfo->vsub);
@@ -369,8 +353,23 @@ static void rpf_partition(struct vsp1_entity *entity,
                          struct v4l2_rect *window)
 {
        struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
+       struct v4l2_rect *rpf_rect = &partition->rpf[rpf->entity.index];
 
-       partition->rpf[rpf->entity.index] = *window;
+       /*
+        * Partition Algorithm Control
+        *
+        * The partition algorithm can split this frame into multiple slices. We
+        * must adjust our partition window based on the pipe configuration to
+        * match the destination partition window. To achieve this, we adjust
+        * our crop to provide a 'sub-crop' matching the expected partition
+        * window.
+        */
+       *rpf_rect = *v4l2_subdev_state_get_crop(entity->state, RWPF_PAD_SINK);
+
+       if (pipe->partitions > 1) {
+               rpf_rect->width = window->width;
+               rpf_rect->left += window->left;
+       }
 }
 
 static const struct vsp1_entity_operations rpf_entity_ops = {
index 4a14fd3baac1b4a03ade30c5e9439fdcd4a33707..e5953d86c17c1354af2705ee1da9bf2b26c9cf68 100644 (file)
@@ -305,10 +305,6 @@ static void uds_configure_partition(struct vsp1_entity *entity,
                                    struct vsp1_dl_body *dlb)
 {
        struct vsp1_uds *uds = to_uds(&entity->subdev);
-       const struct v4l2_mbus_framefmt *output;
-
-       output = v4l2_subdev_state_get_format(uds->entity.state,
-                                             UDS_PAD_SOURCE);
 
        /* Input size clipping. */
        vsp1_uds_write(uds, dlb, VI6_UDS_HSZCLIP, VI6_UDS_HSZCLIP_HCEN |
@@ -320,7 +316,7 @@ static void uds_configure_partition(struct vsp1_entity *entity,
        vsp1_uds_write(uds, dlb, VI6_UDS_CLIP_SIZE,
                       (partition->uds_source.width
                                << VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) |
-                      (output->height
+                      (partition->uds_source.height
                                << VI6_UDS_CLIP_SIZE_VSIZE_SHIFT));
 }
 
index f8d1e2f476914eb4d6770ffaaad8c6c35c9a5cb8..5c363ff1d36c633b002779d7bf43c0d31c9bd6c8 100644 (file)
@@ -370,7 +370,6 @@ static void wpf_configure_partition(struct vsp1_entity *entity,
        struct vsp1_rwpf *wpf = to_rwpf(&entity->subdev);
        struct vsp1_device *vsp1 = wpf->entity.vsp1;
        struct vsp1_rwpf_memory mem = wpf->mem;
-       const struct v4l2_mbus_framefmt *sink_format;
        const struct v4l2_pix_format_mplane *format = &wpf->format;
        const struct vsp1_format_info *fmtinfo = wpf->fmtinfo;
        unsigned int width;
@@ -380,20 +379,13 @@ static void wpf_configure_partition(struct vsp1_entity *entity,
        unsigned int flip;
        unsigned int i;
 
-       sink_format = v4l2_subdev_state_get_format(wpf->entity.state,
-                                                  RWPF_PAD_SINK);
-       width = sink_format->width;
-       height = sink_format->height;
-       left = 0;
-
        /*
-        * Cropping. The partition algorithm can split the image into
-        * multiple slices.
+        * Cropping. The partition algorithm can split the image into multiple
+        * slices.
         */
-       if (pipe->partitions > 1) {
-               width = partition->wpf.width;
-               left = partition->wpf.left;
-       }
+       width = partition->wpf.width;
+       left = partition->wpf.left;
+       height = partition->wpf.height;
 
        vsp1_wpf_write(wpf, dlb, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN |
                       (0 << VI6_WPF_SZCLIP_OFST_SHIFT) |