[media] v4l: vsp1: Don't configure RPF memory buffers before calculating offsets
[cascardo/linux.git] / drivers / media / platform / vsp1 / vsp1_rwpf.c
index 9688c21..54070cc 100644 (file)
@@ -230,3 +230,64 @@ int vsp1_rwpf_set_selection(struct v4l2_subdev *subdev,
 
        return 0;
 }
+
+/* -----------------------------------------------------------------------------
+ * Controls
+ */
+
+static int vsp1_rwpf_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+       struct vsp1_rwpf *rwpf =
+               container_of(ctrl->handler, struct vsp1_rwpf, ctrls);
+
+       switch (ctrl->id) {
+       case V4L2_CID_ALPHA_COMPONENT:
+               rwpf->alpha = ctrl->val;
+               break;
+       }
+
+       return 0;
+}
+
+static const struct v4l2_ctrl_ops vsp1_rwpf_ctrl_ops = {
+       .s_ctrl = vsp1_rwpf_s_ctrl,
+};
+
+int vsp1_rwpf_init_ctrls(struct vsp1_rwpf *rwpf)
+{
+       rwpf->alpha = 255;
+
+       v4l2_ctrl_handler_init(&rwpf->ctrls, 1);
+       v4l2_ctrl_new_std(&rwpf->ctrls, &vsp1_rwpf_ctrl_ops,
+                         V4L2_CID_ALPHA_COMPONENT, 0, 255, 1, 255);
+
+       rwpf->entity.subdev.ctrl_handler = &rwpf->ctrls;
+
+       return rwpf->ctrls.error;
+}
+
+/* -----------------------------------------------------------------------------
+ * Buffers
+ */
+
+/**
+ * vsp1_rwpf_set_memory - Configure DMA addresses for a [RW]PF
+ * @rwpf: the [RW]PF instance
+ * @mem: DMA memory addresses
+ * @apply: whether to apply the configuration to the hardware
+ *
+ * This function stores the DMA addresses for all planes in the rwpf instance
+ * and optionally applies the configuration to hardware registers if the apply
+ * argument is set to true.
+ */
+void vsp1_rwpf_set_memory(struct vsp1_rwpf *rwpf, struct vsp1_rwpf_memory *mem,
+                         bool apply)
+{
+       unsigned int i;
+
+       for (i = 0; i < 3; ++i)
+               rwpf->buf_addr[i] = mem->addr[i];
+
+       if (apply)
+               rwpf->ops->set_memory(rwpf);
+}