media: i2c: imx258: Allow configuration of clock lane behaviour
authorDave Stevenson <dave.stevenson@raspberrypi.com>
Thu, 31 Mar 2022 14:33:59 +0000 (15:33 +0100)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:33 +0000 (11:33 +0000)
The sensor supports the clock lane either remaining in HS mode
during frame blanking, or dropping to LP11.

Add configuration of the mode via V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK.

Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drivers/media/i2c/imx258.c

index bc33d48..8b0c5f2 100644 (file)
@@ -72,6 +72,8 @@
 /* Test Pattern Control */
 #define IMX258_REG_TEST_PATTERN                0x0600
 
+#define IMX258_CLK_BLANK_STOP          0x4040
+
 /* Orientation */
 #define REG_MIRROR_FLIP_CONTROL                0x0101
 #define REG_CONFIG_MIRROR_FLIP         0x03
@@ -829,6 +831,7 @@ struct imx258 {
        const struct imx258_link_freq_config *link_freq_configs;
        const s64 *link_freq_menu_items;
        unsigned int nlanes;
+       unsigned int csi2_flags;
 
        /*
         * Mutex for serialized access:
@@ -1260,6 +1263,15 @@ static int imx258_start_streaming(struct imx258 *imx258)
                return ret;
        }
 
+       ret = imx258_write_reg(imx258, IMX258_CLK_BLANK_STOP,
+                              IMX258_REG_VALUE_08BIT,
+                              imx258->csi2_flags & V4L2_MBUS_CSI2_NONCONTINUOUS_CLOCK ?
+                              1 : 0);
+       if (ret) {
+               dev_err(&client->dev, "%s failed to set clock lane mode\n", __func__);
+               return ret;
+       }
+
        /* Apply default values of current mode */
        reg_list = &imx258->cur_mode->reg_list;
        ret = imx258_write_regs(imx258, reg_list->regs, reg_list->num_of_regs);
@@ -1674,6 +1686,8 @@ static int imx258_probe(struct i2c_client *client)
                goto error_endpoint_poweron;
        }
 
+       imx258->csi2_flags = ep.bus.mipi_csi2.flags;
+
        /* Initialize subdev */
        v4l2_i2c_subdev_init(&imx258->sd, client, &imx258_subdev_ops);