media: i2c: imx219: Implement V4L2_CID_LINK_FREQ control
authorAndrey Konovalov <andrey.konovalov@linaro.org>
Tue, 26 Jan 2021 07:49:34 +0000 (08:49 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sat, 6 Feb 2021 08:40:47 +0000 (09:40 +0100)
This control is needed for imx219 driver, as the link frequency
is independent from the pixel rate in this case, and can't be
calculated from the pixel rate.

Signed-off-by: Andrey Konovalov <andrey.konovalov@linaro.org>
Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/i2c/imx219.c

index 92a8d52..6e3382b 100644 (file)
@@ -390,6 +390,10 @@ static const struct imx219_reg raw10_framefmt_regs[] = {
        {0x0309, 0x0a},
 };
 
+static const s64 imx219_link_freq_menu[] = {
+       IMX219_DEFAULT_LINK_FREQ,
+};
+
 static const char * const imx219_test_pattern_menu[] = {
        "Disabled",
        "Color Bars",
@@ -547,6 +551,7 @@ struct imx219 {
        struct v4l2_ctrl_handler ctrl_handler;
        /* V4L2 Controls */
        struct v4l2_ctrl *pixel_rate;
+       struct v4l2_ctrl *link_freq;
        struct v4l2_ctrl *exposure;
        struct v4l2_ctrl *vflip;
        struct v4l2_ctrl *hflip;
@@ -1269,7 +1274,7 @@ static int imx219_init_controls(struct imx219 *imx219)
        int i, ret;
 
        ctrl_hdlr = &imx219->ctrl_handler;
-       ret = v4l2_ctrl_handler_init(ctrl_hdlr, 11);
+       ret = v4l2_ctrl_handler_init(ctrl_hdlr, 12);
        if (ret)
                return ret;
 
@@ -1283,6 +1288,14 @@ static int imx219_init_controls(struct imx219 *imx219)
                                               IMX219_PIXEL_RATE, 1,
                                               IMX219_PIXEL_RATE);
 
+       imx219->link_freq =
+               v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx219_ctrl_ops,
+                                      V4L2_CID_LINK_FREQ,
+                                      ARRAY_SIZE(imx219_link_freq_menu) - 1, 0,
+                                      imx219_link_freq_menu);
+       if (imx219->link_freq)
+               imx219->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
        /* Initial vblank/hblank/exposure parameters based on current mode */
        imx219->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
                                           V4L2_CID_VBLANK, IMX219_VBLANK_MIN,