media: qcom: camss: Pass line_num from compat resources
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Mon, 25 Sep 2023 15:46:56 +0000 (16:46 +0100)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Sat, 7 Oct 2023 08:55:44 +0000 (10:55 +0200)
line_num indicates the number of RDI - raw data interface channels which
are associated with a given IFE/VFE - image/video front end.

On several SoCs the RDI number is not static for each VFE - for example
on sm8250 VFE Lite has four RDIs where regular VFE has three.

Assigning line_num statically in the subdev_init() phase initialises
each VFE to the lower number, meaning in practical terms that we are
lobbing off one RDI on some VFEs.

Interrupt handling uses static for (i = RDI0; i < RDI2; i++) {} in some
of our VFE blocks but this can't work for situations where we have a
mixture of VFE @ 3 RDI and VFE-lite @ 4 RDI blocks.

First step to remediate is to pass line_num from a compat string
controlled data-structure and do so on a per-VFE basis.

Later patches will assign the correct number of RDI blocks per VFE.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
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-4-1.c
drivers/media/platform/qcom/camss/camss-vfe-4-7.c
drivers/media/platform/qcom/camss/camss-vfe-4-8.c
drivers/media/platform/qcom/camss/camss-vfe-480.c
drivers/media/platform/qcom/camss/camss-vfe.c
drivers/media/platform/qcom/camss/camss.c
drivers/media/platform/qcom/camss/camss.h

index 82d2392022dd13d20d82c9226d3e7d2f9cd6b7d3..2ba7160b3bd1eddbd23ad1745c1d989fec5a172e 100644 (file)
@@ -753,8 +753,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
 {
        vfe->isr_ops = vfe_isr_ops_170;
        vfe->video_ops = vfe_video_ops_170;
-
-       vfe->line_num = VFE_LINE_NUM_GEN2;
 }
 
 const struct vfe_hw_ops vfe_ops_170 = {
index bc309f326f51969302a9533f50716cb397e85455..2911e4126e7adb5a47fbd3591cd617aee2dfb7ed 100644 (file)
@@ -992,8 +992,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
        vfe->isr_ops = vfe_isr_ops_gen1;
        vfe->ops_gen1 = &vfe_ops_gen1_4_1;
        vfe->video_ops = vfe_video_ops_gen1;
-
-       vfe->line_num = VFE_LINE_NUM_GEN1;
 }
 
 const struct vfe_hw_ops vfe_ops_4_1 = {
index 8acd76c9746ba48789405af65c8c6d7dbbdb4098..b65ed0fef595e8e6fb8914f0ffb6e00a23ce6b0d 100644 (file)
@@ -1188,8 +1188,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
        vfe->isr_ops = vfe_isr_ops_gen1;
        vfe->ops_gen1 = &vfe_ops_gen1_4_7;
        vfe->video_ops = vfe_video_ops_gen1;
-
-       vfe->line_num = VFE_LINE_NUM_GEN1;
 }
 
 const struct vfe_hw_ops vfe_ops_4_7 = {
index 3a0167ecf873a6cdf506843954e3f6b9091257b0..7b3805177f037fe9a6bbb8ebc27355d3017f906c 100644 (file)
@@ -1173,8 +1173,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
        vfe->isr_ops = vfe_isr_ops_gen1;
        vfe->ops_gen1 = &vfe_ops_gen1_4_8;
        vfe->video_ops = vfe_video_ops_gen1;
-
-       vfe->line_num = VFE_LINE_NUM_GEN1;
 }
 
 const struct vfe_hw_ops vfe_ops_4_8 = {
index 074fa4e38163ece839337daa7f20da3146aa263d..43a2964121f22dde4d4ed8c27530b6de6edd623a 100644 (file)
@@ -569,7 +569,6 @@ static const struct camss_video_ops vfe_video_ops_480 = {
 static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe)
 {
        vfe->video_ops = vfe_video_ops_480;
-       vfe->line_num = MAX_VFE_OUTPUT_LINES;
 }
 
 const struct vfe_hw_ops vfe_ops_480 = {
index 94ee7c7039eb39120f3cac7c455c8c6093eaf140..f381c82f1f8772c9acf120864132d1afae659d81 100644 (file)
@@ -1305,6 +1305,11 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe,
        default:
                return -EINVAL;
        }
+
+       if (!res->line_num)
+               return -EINVAL;
+
+       vfe->line_num = res->line_num;
        vfe->ops->subdev_init(dev, vfe);
 
        /* Memory */
index d1152a7db9cd233a1a5a66562305e931b57df4fd..54886a2a449b0f0468fd93453bdec1e35a80ee22 100644 (file)
@@ -123,7 +123,8 @@ static const struct camss_subdev_resources vfe_res_8x16[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe0" },
-               .interrupt = { "vfe0" }
+               .interrupt = { "vfe0" },
+               .line_num = VFE_LINE_NUM_GEN1,
        }
 };
 
@@ -263,7 +264,8 @@ static const struct camss_subdev_resources vfe_res_8x96[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe0" },
-               .interrupt = { "vfe0" }
+               .interrupt = { "vfe0" },
+               .line_num = VFE_LINE_NUM_GEN1,
        },
 
        /* VFE1 */
@@ -281,7 +283,8 @@ static const struct camss_subdev_resources vfe_res_8x96[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe1" },
-               .interrupt = { "vfe1" }
+               .interrupt = { "vfe1" },
+               .line_num = VFE_LINE_NUM_GEN1,
        }
 };
 
@@ -442,7 +445,8 @@ static const struct camss_subdev_resources vfe_res_660[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe0" },
-               .interrupt = { "vfe0" }
+               .interrupt = { "vfe0" },
+               .line_num = VFE_LINE_NUM_GEN1,
        },
 
        /* VFE1 */
@@ -463,7 +467,8 @@ static const struct camss_subdev_resources vfe_res_660[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe1" },
-               .interrupt = { "vfe1" }
+               .interrupt = { "vfe1" },
+               .line_num = VFE_LINE_NUM_GEN1,
        }
 };
 
@@ -621,7 +626,8 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                                { 19200000, 75000000, 384000000, 538666667 },
                                { 384000000 } },
                .reg = { "vfe0" },
-               .interrupt = { "vfe0" }
+               .interrupt = { "vfe0" },
+               .line_num = VFE_LINE_NUM_GEN2,
        },
 
        /* VFE1 */
@@ -641,7 +647,8 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                                { 19200000, 75000000, 384000000, 538666667 },
                                { 384000000 } },
                .reg = { "vfe1" },
-               .interrupt = { "vfe1" }
+               .interrupt = { "vfe1" },
+               .line_num = VFE_LINE_NUM_GEN2,
        },
 
        /* VFE-lite */
@@ -660,7 +667,8 @@ static const struct camss_subdev_resources vfe_res_845[] = {
                                { 19200000, 75000000, 384000000, 538666667 },
                                { 384000000 } },
                .reg = { "vfe_lite" },
-               .interrupt = { "vfe_lite" }
+               .interrupt = { "vfe_lite" },
+               .line_num = VFE_LINE_NUM_GEN2,
        }
 };
 
@@ -787,7 +795,8 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe0" },
-               .interrupt = { "vfe0" }
+               .interrupt = { "vfe0" },
+               .line_num = 4,
        },
        /* VFE1 */
        {
@@ -805,7 +814,8 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                                { 0 },
                                { 0 } },
                .reg = { "vfe1" },
-               .interrupt = { "vfe1" }
+               .interrupt = { "vfe1" },
+               .line_num = 4,
        },
        /* VFE2 (lite) */
        {
@@ -822,7 +832,8 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                                { 400000000, 480000000 },
                                { 0 } },
                .reg = { "vfe_lite0" },
-               .interrupt = { "vfe_lite0" }
+               .interrupt = { "vfe_lite0" },
+               .line_num = 4,
        },
        /* VFE3 (lite) */
        {
@@ -839,7 +850,8 @@ static const struct camss_subdev_resources vfe_res_8250[] = {
                                { 400000000, 480000000 },
                                { 0 } },
                .reg = { "vfe_lite1" },
-               .interrupt = { "vfe_lite1" }
+               .interrupt = { "vfe_lite1" },
+               .line_num = 4,
        },
 };
 
index 3b6562b515d46b6cd7ca7f9d5ff4f5f629d90bc5..fc02aa84a5dd765aca87a567c12e5b527bc088a5 100644 (file)
@@ -48,6 +48,7 @@ struct camss_subdev_resources {
        u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX];
        char *reg[CAMSS_RES_MAX];
        char *interrupt[CAMSS_RES_MAX];
+       u8 line_num;
 };
 
 struct icc_bw_tbl {