media: camss: vfe: Reserve VFE lines on stream start and link to CSID
authorMilen Mitkov <quic_mmitkov@quicinc.com>
Fri, 9 Dec 2022 09:40:35 +0000 (11:40 +0200)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 11 Apr 2023 15:10:10 +0000 (17:10 +0200)
For multiple virtual channels support, each VFE line can be in either
ON, RESERVED or OFF states. This allows the starting and stopping
of a VFE line independently of other active VFE lines (e.g. already-
running lines stay in ON state, and newly-added lines are RESERVED)

Also, link the CSID entity's source ports to corresponding VFE lines.

Signed-off-by: Milen Mitkov <quic_mmitkov@quicinc.com>
Reviewed-by: Robert Foss <robert.foss@linaro.org>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Acked-by: Robert Foss <robert.foss@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/qcom/camss/camss-vfe-170.c
drivers/media/platform/qcom/camss/camss-vfe-480.c
drivers/media/platform/qcom/camss/camss-vfe-gen1.c
drivers/media/platform/qcom/camss/camss-vfe.c
drivers/media/platform/qcom/camss/camss.c

index 8e506a8..02494c8 100644 (file)
@@ -409,7 +409,7 @@ static int vfe_get_output(struct vfe_line *line)
        spin_lock_irqsave(&vfe->output_lock, flags);
 
        output = &line->output;
-       if (output->state != VFE_OUTPUT_OFF) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is running\n");
                goto error;
        }
@@ -462,7 +462,7 @@ static int vfe_enable_output(struct vfe_line *line)
 
        ops->reg_update_clear(vfe, line->id);
 
-       if (output->state != VFE_OUTPUT_OFF) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is not in reserved state %d\n",
                        output->state);
                spin_unlock_irqrestore(&vfe->output_lock, flags);
index 3aa962b..f03a84d 100644 (file)
@@ -239,7 +239,7 @@ static int vfe_get_output(struct vfe_line *line)
        spin_lock_irqsave(&vfe->output_lock, flags);
 
        output = &line->output;
-       if (output->state != VFE_OUTPUT_OFF) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is running\n");
                goto error;
        }
@@ -279,7 +279,7 @@ static int vfe_enable_output(struct vfe_line *line)
 
        vfe_reg_update_clear(vfe, line->id);
 
-       if (output->state != VFE_OUTPUT_OFF) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is not in reserved state %d\n",
                        output->state);
                spin_unlock_irqrestore(&vfe->output_lock, flags);
index 4fd265d..239d3d4 100644 (file)
@@ -194,7 +194,7 @@ static int vfe_enable_output(struct vfe_line *line)
 
        ops->reg_update_clear(vfe, line->id);
 
-       if (output->state != VFE_OUTPUT_RESERVED) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is not in reserved state %d\n", output->state);
                spin_unlock_irqrestore(&vfe->output_lock, flags);
                return -EINVAL;
@@ -289,7 +289,7 @@ static int vfe_get_output(struct vfe_line *line)
        spin_lock_irqsave(&vfe->output_lock, flags);
 
        output = &line->output;
-       if (output->state != VFE_OUTPUT_OFF) {
+       if (output->state > VFE_OUTPUT_RESERVED) {
                dev_err(vfe->camss->dev, "Output is running\n");
                goto error;
        }
index a26e4a5..e0832f3 100644 (file)
@@ -740,6 +740,7 @@ static int vfe_set_stream(struct v4l2_subdev *sd, int enable)
        int ret;
 
        if (enable) {
+               line->output.state = VFE_OUTPUT_RESERVED;
                ret = vfe->ops->vfe_enable(line);
                if (ret < 0)
                        dev_err(vfe->camss->dev,
index df8a507..1ef26ae 100644 (file)
@@ -1320,7 +1320,7 @@ static int camss_register_entities(struct camss *camss)
                                        struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev;
 
                                        ret = media_create_pad_link(&csid->entity,
-                                                                   MSM_CSID_PAD_SRC,
+                                                                   MSM_CSID_PAD_FIRST_SRC + j,
                                                                    &vfe->entity,
                                                                    MSM_VFE_PAD_SINK,
                                                                    0);