| From 071da5b29ba5e5821f15cfe86604241244f5719d Mon Sep 17 00:00:00 2001 |
| From: Janusz Krzysztofik <jmkrzyszt@gmail.com> |
| Date: Fri, 29 Mar 2019 21:06:09 -0400 |
| Subject: media: ov6650: Move v4l2_clk_get() to ov6650_video_probe() helper |
| |
| [ Upstream commit ccdd85d518d8b9320ace1d87271f0ba2175f21fa ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/i2c/ov6650.c | 25 ++++++++++++++----------- |
| 1 file changed, 14 insertions(+), 11 deletions(-) |
| |
| diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c |
| index f9359b11fa5cb..de7d9790f0542 100644 |
| --- a/drivers/media/i2c/ov6650.c |
| +++ b/drivers/media/i2c/ov6650.c |
| @@ -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; |
| } |
| -- |
| 2.20.1 |
| |