Commit f180ebae authored by Josh Wu's avatar Josh Wu Committed by Mauro Carvalho Chehab

[media] media: ov2640: add async probe function

In async probe, there is a case that ov2640 is probed before the
host device which provided 'mclk'.
To support this async probe, we will get 'mclk' at first in the probe(),
if failed it will return -EPROBE_DEFER. That will let ov2640 wait for
the host device probed.
Signed-off-by: default avatarJosh Wu <josh.wu@atmel.com>
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 0b9508aa
...@@ -1068,6 +1068,10 @@ static int ov2640_probe(struct i2c_client *client, ...@@ -1068,6 +1068,10 @@ static int ov2640_probe(struct i2c_client *client,
return -ENOMEM; return -ENOMEM;
} }
priv->clk = v4l2_clk_get(&client->dev, "mclk");
if (IS_ERR(priv->clk))
return -EPROBE_DEFER;
v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops); v4l2_i2c_subdev_init(&priv->subdev, client, &ov2640_subdev_ops);
v4l2_ctrl_handler_init(&priv->hdl, 2); v4l2_ctrl_handler_init(&priv->hdl, 2);
v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops, v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,
...@@ -1075,24 +1079,27 @@ static int ov2640_probe(struct i2c_client *client, ...@@ -1075,24 +1079,27 @@ static int ov2640_probe(struct i2c_client *client,
v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops, v4l2_ctrl_new_std(&priv->hdl, &ov2640_ctrl_ops,
V4L2_CID_HFLIP, 0, 1, 1, 0); V4L2_CID_HFLIP, 0, 1, 1, 0);
priv->subdev.ctrl_handler = &priv->hdl; priv->subdev.ctrl_handler = &priv->hdl;
if (priv->hdl.error) if (priv->hdl.error) {
return priv->hdl.error; ret = priv->hdl.error;
goto err_clk;
priv->clk = v4l2_clk_get(&client->dev, "mclk");
if (IS_ERR(priv->clk)) {
ret = PTR_ERR(priv->clk);
goto eclkget;
} }
ret = ov2640_video_probe(client); ret = ov2640_video_probe(client);
if (ret) { if (ret < 0)
v4l2_clk_put(priv->clk); goto err_videoprobe;
eclkget:
v4l2_ctrl_handler_free(&priv->hdl);
} else {
dev_info(&adapter->dev, "OV2640 Probed\n");
}
ret = v4l2_async_register_subdev(&priv->subdev);
if (ret < 0)
goto err_videoprobe;
dev_info(&adapter->dev, "OV2640 Probed\n");
return 0;
err_videoprobe:
v4l2_ctrl_handler_free(&priv->hdl);
err_clk:
v4l2_clk_put(priv->clk);
return ret; return ret;
} }
...@@ -1100,6 +1107,7 @@ static int ov2640_remove(struct i2c_client *client) ...@@ -1100,6 +1107,7 @@ static int ov2640_remove(struct i2c_client *client)
{ {
struct ov2640_priv *priv = to_ov2640(client); struct ov2640_priv *priv = to_ov2640(client);
v4l2_async_unregister_subdev(&priv->subdev);
v4l2_clk_put(priv->clk); v4l2_clk_put(priv->clk);
v4l2_device_unregister_subdev(&priv->subdev); v4l2_device_unregister_subdev(&priv->subdev);
v4l2_ctrl_handler_free(&priv->hdl); v4l2_ctrl_handler_free(&priv->hdl);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment