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 8e506a805d11917811ca40e72210f21359cb4970..02494c89da91c8db750df58f95f24050eec15238 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 3aa962b5663bc49925c5bb8a949127b147df85cd..f03a84daafbe2e730e95e7b44260b1e3ac195ff4 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 4fd265d01883468f1d1d6525c7b391b357c8b6d2..239d3d4ac66612a462f013a9306bdb0490b2f7f1 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 a26e4a5d87b6bb7d03340994cbcac38ec5c68c21..e0832f3f4f25c046049e51b9fdfde932ad30d0db 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 df8a507ce8ac7ed1a0a6255cccc4f2069c758f09..1ef26aea3eae629f52ed862cef722ead6e0e80a3 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);