media: i2c: imx214: Move controls init to separate function
authorAndré Apitzsch <git@apitzsch.eu>
Wed, 6 Dec 2023 22:33:56 +0000 (23:33 +0100)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 13 Dec 2023 12:21:21 +0000 (13:21 +0100)
Code refinement.

While at it, don't destroy the mutex not initialized yet if the controls
are initialized incorrectly.

Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: André Apitzsch <git@apitzsch.eu>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/i2c/imx214.c

index b3cb034c382f38a533e70c741d3616e9680d0102..7a1f78564a87e3f1bd3dabbf7848f8b5cfb38771 100644 (file)
@@ -695,6 +695,69 @@ static const struct v4l2_ctrl_ops imx214_ctrl_ops = {
        .s_ctrl = imx214_set_ctrl,
 };
 
+static int imx214_ctrls_init(struct imx214 *imx214)
+{
+       static const s64 link_freq[] = {
+               IMX214_DEFAULT_LINK_FREQ
+       };
+       static const struct v4l2_area unit_size = {
+               .width = 1120,
+               .height = 1120,
+       };
+       struct v4l2_ctrl_handler *ctrl_hdlr;
+       int ret;
+
+       ctrl_hdlr = &imx214->ctrls;
+       ret = v4l2_ctrl_handler_init(&imx214->ctrls, 3);
+       if (ret)
+               return ret;
+
+       imx214->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, NULL,
+                                              V4L2_CID_PIXEL_RATE, 0,
+                                              IMX214_DEFAULT_PIXEL_RATE, 1,
+                                              IMX214_DEFAULT_PIXEL_RATE);
+
+       imx214->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr, NULL,
+                                                  V4L2_CID_LINK_FREQ,
+                                                  ARRAY_SIZE(link_freq) - 1,
+                                                  0, link_freq);
+       if (imx214->link_freq)
+               imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
+
+       /*
+        * WARNING!
+        * Values obtained reverse engineering blobs and/or devices.
+        * Ranges and functionality might be wrong.
+        *
+        * Sony, please release some register set documentation for the
+        * device.
+        *
+        * Yours sincerely, Ricardo.
+        */
+       imx214->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx214_ctrl_ops,
+                                            V4L2_CID_EXPOSURE,
+                                            IMX214_EXPOSURE_MIN,
+                                            IMX214_EXPOSURE_MAX,
+                                            IMX214_EXPOSURE_STEP,
+                                            IMX214_EXPOSURE_DEFAULT);
+
+       imx214->unit_size = v4l2_ctrl_new_std_compound(ctrl_hdlr,
+                               NULL,
+                               V4L2_CID_UNIT_CELL_SIZE,
+                               v4l2_ctrl_ptr_create((void *)&unit_size));
+
+       ret = ctrl_hdlr->error;
+       if (ret) {
+               v4l2_ctrl_handler_free(ctrl_hdlr);
+               dev_err(imx214->dev, "failed to add controls: %d\n", ret);
+               return ret;
+       }
+
+       imx214->sd.ctrl_handler = ctrl_hdlr;
+
+       return 0;
+};
+
 #define MAX_CMD 4
 static int imx214_write_table(struct imx214 *imx214,
                              const struct reg_8 table[])
@@ -921,13 +984,6 @@ static int imx214_probe(struct i2c_client *client)
 {
        struct device *dev = &client->dev;
        struct imx214 *imx214;
-       static const s64 link_freq[] = {
-               IMX214_DEFAULT_LINK_FREQ,
-       };
-       static const struct v4l2_area unit_size = {
-               .width = 1120,
-               .height = 1120,
-       };
        int ret;
 
        ret = imx214_parse_fwnode(dev);
@@ -983,48 +1039,10 @@ static int imx214_probe(struct i2c_client *client)
        pm_runtime_enable(imx214->dev);
        pm_runtime_idle(imx214->dev);
 
-       v4l2_ctrl_handler_init(&imx214->ctrls, 3);
-
-       imx214->pixel_rate = v4l2_ctrl_new_std(&imx214->ctrls, NULL,
-                                              V4L2_CID_PIXEL_RATE, 0,
-                                              IMX214_DEFAULT_PIXEL_RATE, 1,
-                                              IMX214_DEFAULT_PIXEL_RATE);
-       imx214->link_freq = v4l2_ctrl_new_int_menu(&imx214->ctrls, NULL,
-                                                  V4L2_CID_LINK_FREQ,
-                                                  ARRAY_SIZE(link_freq) - 1,
-                                                  0, link_freq);
-       if (imx214->link_freq)
-               imx214->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
-
-       /*
-        * WARNING!
-        * Values obtained reverse engineering blobs and/or devices.
-        * Ranges and functionality might be wrong.
-        *
-        * Sony, please release some register set documentation for the
-        * device.
-        *
-        * Yours sincerely, Ricardo.
-        */
-       imx214->exposure = v4l2_ctrl_new_std(&imx214->ctrls, &imx214_ctrl_ops,
-                                            V4L2_CID_EXPOSURE,
-                                            IMX214_EXPOSURE_MIN,
-                                            IMX214_EXPOSURE_MAX,
-                                            IMX214_EXPOSURE_STEP,
-                                            IMX214_EXPOSURE_DEFAULT);
-
-       imx214->unit_size = v4l2_ctrl_new_std_compound(&imx214->ctrls,
-                               NULL,
-                               V4L2_CID_UNIT_CELL_SIZE,
-                               v4l2_ctrl_ptr_create((void *)&unit_size));
-       ret = imx214->ctrls.error;
-       if (ret) {
-               dev_err(&client->dev, "%s control init failed (%d)\n",
-                       __func__, ret);
-               goto free_ctrl;
-       }
+       ret = imx214_ctrls_init(imx214);
+       if (ret < 0)
+               goto error_power_off;
 
-       imx214->sd.ctrl_handler = &imx214->ctrls;
        mutex_init(&imx214->mutex);
        imx214->ctrls.lock = &imx214->mutex;
 
@@ -1054,6 +1072,7 @@ free_entity:
 free_ctrl:
        mutex_destroy(&imx214->mutex);
        v4l2_ctrl_handler_free(&imx214->ctrls);
+error_power_off:
        pm_runtime_disable(imx214->dev);
 
        return ret;