media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper
authorJanusz Krzysztofik <jmkrzyszt@gmail.com>
Sat, 30 Mar 2019 01:06:09 +0000 (21:06 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 22 Apr 2019 15:33:03 +0000 (11:33 -0400)
In preparation for adding asynchronous subdevice support to the driver,
don't acquire v4l2_clk from the driver .probe() callback as that may
fail if the clock is provided by a bridge driver which may be not yet
initialized.  Move the v4l2_clk_get() to ov6650_video_probe() helper
which is going to be converted to v4l2_subdev_internal_ops.registered()
callback, executed only when the bridge driver is ready.

Signed-off-by: Janusz Krzysztofik <jmkrzyszt@gmail.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/i2c/ov6650.c

index f9359b1..de7d979 100644 (file)
@@ -810,9 +810,16 @@ static int ov6650_video_probe(struct i2c_client *client)
        u8              pidh, pidl, midh, midl;
        int             ret;
 
+       priv->clk = v4l2_clk_get(&client->dev, NULL);
+       if (IS_ERR(priv->clk)) {
+               ret = PTR_ERR(priv->clk);
+               dev_err(&client->dev, "v4l2_clk request err: %d\n", ret);
+               return ret;
+       }
+
        ret = ov6650_s_power(&priv->subdev, 1);
        if (ret < 0)
-               return ret;
+               goto eclkput;
 
        msleep(20);
 
@@ -849,6 +856,11 @@ static int ov6650_video_probe(struct i2c_client *client)
 
 done:
        ov6650_s_power(&priv->subdev, 0);
+       if (!ret)
+               return 0;
+eclkput:
+       v4l2_clk_put(priv->clk);
+
        return ret;
 }
 
@@ -991,18 +1003,9 @@ static int ov6650_probe(struct i2c_client *client,
        priv->code        = MEDIA_BUS_FMT_YUYV8_2X8;
        priv->colorspace  = V4L2_COLORSPACE_JPEG;
 
-       priv->clk = v4l2_clk_get(&client->dev, NULL);
-       if (IS_ERR(priv->clk)) {
-               ret = PTR_ERR(priv->clk);
-               goto eclkget;
-       }
-
        ret = ov6650_video_probe(client);
-       if (ret) {
-               v4l2_clk_put(priv->clk);
-eclkget:
+       if (ret)
                v4l2_ctrl_handler_free(&priv->hdl);
-       }
 
        return ret;
 }