VSP1_PIPELINE_STOPPING,
 };
 
+/*
+ * struct vsp1_partition - A description of a slice for the partition algorithm
+ * @left: horizontal coordinate of the partition start in pixels relative to the
+ *       left edge of the image
+ * @width: partition width in pixels
+ */
+struct vsp1_partition {
+       unsigned int left;
+       unsigned int width;
+};
+
 /*
  * struct vsp1_pipeline - A VSP1 hardware pipeline
  * @pipe: the media pipeline
        struct vsp1_dl_list *dl;
 
        unsigned int partitions;
-       struct v4l2_rect partition;
-       struct v4l2_rect *part_table;
+       struct vsp1_partition *partition;
+       struct vsp1_partition *part_table;
 };
 
 void vsp1_pipeline_reset(struct vsp1_pipeline *pipe);
 
                        output = vsp1_entity_get_pad_format(wpf, wpf->config,
                                                            RWPF_PAD_SINK);
 
-                       crop.width = pipe->partition.width * input_width
+                       crop.width = pipe->partition->width * input_width
                                   / output->width;
-                       crop.left += pipe->partition.left * input_width
+                       crop.left += pipe->partition->left * input_width
                                   / output->width;
                }
 
 
        unsigned int vscale;
        bool multitap;
 
+       input = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
+                                          UDS_PAD_SINK);
+       output = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
+                                           UDS_PAD_SOURCE);
+
        if (params == VSP1_ENTITY_PARAMS_PARTITION) {
-               const struct v4l2_rect *clip = &pipe->partition;
+               struct vsp1_partition *partition = pipe->partition;
 
                vsp1_uds_write(uds, dl, VI6_UDS_CLIP_SIZE,
-                              (clip->width << VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) |
-                              (clip->height << VI6_UDS_CLIP_SIZE_VSIZE_SHIFT));
+                              (partition->width
+                                       << VI6_UDS_CLIP_SIZE_HSIZE_SHIFT) |
+                              (output->height
+                                       << VI6_UDS_CLIP_SIZE_VSIZE_SHIFT));
                return;
        }
 
        if (params != VSP1_ENTITY_PARAMS_INIT)
                return;
 
-       input = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
-                                          UDS_PAD_SINK);
-       output = vsp1_entity_get_pad_format(&uds->entity, uds->entity.config,
-                                           UDS_PAD_SOURCE);
-
        hscale = uds_compute_ratio(input->width, output->width);
        vscale = uds_compute_ratio(input->height, output->height);
 
 
  */
 
 /**
- * vsp1_video_partition - Calculate the active partition output window
+ * vsp1_video_calculate_partition - Calculate the active partition output window
  *
+ * @pipe: the pipeline
+ * @partition: partition that will hold the calculated values
  * @div_size: pre-determined maximum partition division size
  * @index: partition index
- *
- * Returns a v4l2_rect describing the partition window.
  */
-static struct v4l2_rect vsp1_video_partition(struct vsp1_pipeline *pipe,
-                                            unsigned int div_size,
-                                            unsigned int index)
+static void vsp1_video_calculate_partition(struct vsp1_pipeline *pipe,
+                                          struct vsp1_partition *partition,
+                                          unsigned int div_size,
+                                          unsigned int index)
 {
        const struct v4l2_mbus_framefmt *format;
-       struct v4l2_rect partition;
        unsigned int modulus;
 
        /*
 
        /* A single partition simply processes the output size in full. */
        if (pipe->partitions <= 1) {
-               partition.left = 0;
-               partition.top = 0;
-               partition.width = format->width;
-               partition.height = format->height;
-               return partition;
+               partition->left = 0;
+               partition->width = format->width;
+               return;
        }
 
        /* Initialise the partition with sane starting conditions. */
-       partition.left = index * div_size;
-       partition.top = 0;
-       partition.width = div_size;
-       partition.height = format->height;
+       partition->left = index * div_size;
+       partition->width = div_size;
 
        modulus = format->width % div_size;
 
                if (modulus < div_size / 2) {
                        if (index == partitions - 1) {
                                /* Halve the penultimate partition. */
-                               partition.width = div_size / 2;
+                               partition->width = div_size / 2;
                        } else if (index == partitions) {
                                /* Increase the final partition. */
-                               partition.width = (div_size / 2) + modulus;
-                               partition.left -= div_size / 2;
+                               partition->width = (div_size / 2) + modulus;
+                               partition->left -= div_size / 2;
                        }
                } else if (index == partitions) {
-                       partition.width = modulus;
+                       partition->width = modulus;
                }
        }
-
-       return partition;
 }
 
 static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
                return -ENOMEM;
 
        for (i = 0; i < pipe->partitions; ++i)
-               pipe->part_table[i] = vsp1_video_partition(pipe, div_size, i);
+               vsp1_video_calculate_partition(pipe, &pipe->part_table[i],
+                                              div_size, i);
 
        return 0;
 }
 {
        struct vsp1_entity *entity;
 
-       pipe->partition = pipe->part_table[partition];
+       pipe->partition = &pipe->part_table[partition];
 
        list_for_each_entry(entity, &pipe->entities, list_pipe) {
                if (entity->ops->configure)
 
                 * multiple slices.
                 */
                if (pipe->partitions > 1)
-                       width = pipe->partition.width;
+                       width = pipe->partition->width;
 
                vsp1_wpf_write(wpf, dl, VI6_WPF_HSZCLIP, VI6_WPF_SZCLIP_EN |
                               (0 << VI6_WPF_SZCLIP_OFST_SHIFT) |
                 * is applied horizontally or vertically accordingly.
                 */
                if (flip & BIT(WPF_CTRL_HFLIP) && !wpf->flip.rotate)
-                       offset = format->width - pipe->partition.left
-                               - pipe->partition.width;
+                       offset = format->width - pipe->partition->left
+                               - pipe->partition->width;
                else if (flip & BIT(WPF_CTRL_VFLIP) && wpf->flip.rotate)
-                       offset = format->height - pipe->partition.left
-                               - pipe->partition.width;
+                       offset = format->height - pipe->partition->left
+                               - pipe->partition->width;
                else
-                       offset = pipe->partition.left;
+                       offset = pipe->partition->left;
 
                for (i = 0; i < format->num_planes; ++i) {
                        unsigned int hsub = i > 0 ? fmtinfo->hsub : 1;
                         * image height.
                         */
                        if (wpf->flip.rotate)
-                               height = pipe->partition.width;
+                               height = pipe->partition->width;
                        else
                                height = format->height;