]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: qcom: camss: csid-340: Enable PIX interface routing
authorLoic Poulain <loic.poulain@oss.qualcomm.com>
Tue, 14 Apr 2026 18:52:00 +0000 (20:52 +0200)
committerBryan O'Donoghue <bod@kernel.org>
Sun, 31 May 2026 08:45:20 +0000 (09:45 +0100)
Add PIX path support to the CSID-340 driver. The hardware exposes a
dedicated PIX interface in addition to the existing RDI paths, but
the driver only supported RDI stream configuration so far.

The PIX path is configured similarly to RDI but requires decode-format
to be specified.

The PIX pipeline can subsequently perform further processing,
including scaling, cropping, and statistics.

Signed-off-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
drivers/media/platform/qcom/camss/camss-csid-340.c

index 183d40d59afb1238ad5b7ba19b94f8f5b81a19c3..eca3f07b8a8a232014350e9e06d3d9772cb96b97 100644 (file)
@@ -55,8 +55,6 @@
 #define CSID_CTRL_HALT_AT_FRAME_BOUNDARY               0
 #define CSID_CTRL_RESUME_AT_FRAME_BOUNDARY             1
 
-#define CSID_MAX_RDI_SRC_STREAMS       (MSM_CSID_MAX_SRC_STREAMS - 1)
-
 enum csid_iface {
        CSID_IFACE_PIX,
        CSID_IFACE_RDI0,
@@ -64,10 +62,11 @@ enum csid_iface {
        CSID_IFACE_RDI2,
 };
 
-static enum csid_iface csid_port_iface_map[CSID_MAX_RDI_SRC_STREAMS] = {
+static enum csid_iface csid_port_iface_map[MSM_CSID_MAX_SRC_STREAMS] = {
        [0] = CSID_IFACE_RDI0,
        [1] = CSID_IFACE_RDI1,
        [2] = CSID_IFACE_RDI2,
+       [3] = CSID_IFACE_PIX,
 };
 
 static void __csid_configure_rx(struct csid_device *csid, struct csid_phy_config *phy)
@@ -84,13 +83,14 @@ static void __csid_configure_rx(struct csid_device *csid, struct csid_phy_config
        writel_relaxed(val, csid->base + CSID_CSI2_RX_CFG1);
 }
 
-static void __csid_configure_rdi_stream(struct csid_device *csid, u8 enable, u8 port, u8 vc)
+static void __csid_configure_stream(struct csid_device *csid, u8 enable, u8 port, u8 vc)
 {
        struct v4l2_mbus_framefmt *input_format = &csid->fmt[MSM_CSID_PAD_FIRST_SRC + port];
        const struct csid_format_info *format = csid_get_fmt_entry(csid->res->formats->formats,
                                                                   csid->res->formats->nformats,
                                                                   input_format->code);
        enum csid_iface iface = csid_port_iface_map[port];
+
        u8 dt_id;
        u32 val;
 
@@ -108,7 +108,11 @@ static void __csid_configure_rdi_stream(struct csid_device *csid, u8 enable, u8
         */
        dt_id = port & 0x03;
 
-       val = CSID_CFG0_DECODE_FORMAT_NOP; /* only for RDI path */
+       if (iface == CSID_IFACE_PIX)
+               val = FIELD_PREP(CSID_CFG0_DECODE_FORMAT_MASK, format->decode_format);
+       else /* RDI is raw, no decoding */
+               val = CSID_CFG0_DECODE_FORMAT_NOP;
+
        val |= FIELD_PREP(CSID_CFG0_DT_MASK, format->data_type);
        val |= FIELD_PREP(CSID_CFG0_VC_MASK, vc);
        val |= FIELD_PREP(CSID_CFG0_DTID_MASK, dt_id);
@@ -116,24 +120,23 @@ static void __csid_configure_rdi_stream(struct csid_device *csid, u8 enable, u8
        if (enable)
                val |= CSID_CFG0_ENABLE;
 
-       dev_dbg(csid->camss->dev, "CSID%u: Stream %s (dt:0x%x port=%u vc=%u)\n",
+       dev_dbg(csid->camss->dev, "CSID%u: Stream %s (dt:0x%x df=0x%x port=%u vc=%u)\n",
                csid->id, enable ? "enable" : "disable", format->data_type,
-               port, vc);
+               format->decode_format, port, vc);
 
        writel_relaxed(val, csid->base + CSID_CFG0(iface));
        writel_relaxed(enable, csid->base + CSID_CTRL(iface));
 }
 
-static void csid_configure_stream(struct csid_device *csid, u8 enable)
+static void csid_configure_streams(struct csid_device *csid, u8 enable)
 {
        int i;
 
        __csid_configure_rx(csid, &csid->phy);
 
-       /* RDIs */
-       for (i = 0; i < CSID_MAX_RDI_SRC_STREAMS; i++) {
+       for (i = 0; i < MSM_CSID_MAX_SRC_STREAMS; i++) {
                if (csid->phy.en_vc & BIT(i))
-                       __csid_configure_rdi_stream(csid, !!enable, i, 0);
+                       __csid_configure_stream(csid, !!enable, i, 0);
        }
 }
 
@@ -189,7 +192,7 @@ static void csid_subdev_init(struct csid_device *csid) {}
 
 const struct csid_hw_ops csid_ops_340 = {
        .configure_testgen_pattern = csid_configure_testgen_pattern,
-       .configure_stream = csid_configure_stream,
+       .configure_stream = csid_configure_streams,
        .hw_version = csid_hw_version,
        .isr = csid_isr,
        .reset = csid_reset,