Parse async sub-devices by using v4l2_subdev_fwnode_reference_parse_sensor_common(). Signed-off-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx> Acked-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> --- drivers/media/i2c/ov13858.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/media/i2c/ov13858.c b/drivers/media/i2c/ov13858.c index af7af0d14c69..0d60defc7492 100644 --- a/drivers/media/i2c/ov13858.c +++ b/drivers/media/i2c/ov13858.c @@ -18,6 +18,7 @@ #include <linux/pm_runtime.h> #include <media/v4l2-ctrls.h> #include <media/v4l2-device.h> +#include <media/v4l2-fwnode.h> #define OV13858_REG_VALUE_08BIT 1 #define OV13858_REG_VALUE_16BIT 2 @@ -1028,6 +1029,7 @@ static const struct ov13858_mode supported_modes[] = { struct ov13858 { struct v4l2_subdev sd; struct media_pad pad; + struct v4l2_async_notifier notifier; struct v4l2_ctrl_handler ctrl_handler; /* V4L2 Controls */ @@ -1715,6 +1717,11 @@ static int ov13858_probe(struct i2c_client *client, if (!ov13858) return -ENOMEM; + ret = v4l2_fwnode_reference_parse_sensor_common( + &client->dev, &ov13858->notifier); + if (ret < 0) + return ret; + /* Initialize subdev */ v4l2_i2c_subdev_init(&ov13858->sd, client, &ov13858_subdev_ops); @@ -1722,7 +1729,7 @@ static int ov13858_probe(struct i2c_client *client, ret = ov13858_identify_module(ov13858); if (ret) { dev_err(&client->dev, "failed to find sensor: %d\n", ret); - return ret; + goto error_notifier_release; } /* Set default mode to max resolution */ @@ -1730,7 +1737,7 @@ static int ov13858_probe(struct i2c_client *client, ret = ov13858_init_controls(ov13858); if (ret) - return ret; + goto error_notifier_release; /* Initialize subdev */ ov13858->sd.internal_ops = &ov13858_internal_ops; @@ -1746,9 +1753,14 @@ static int ov13858_probe(struct i2c_client *client, goto error_handler_free; } + ret = v4l2_async_subdev_notifier_register(&ov13858->sd, + &ov13858->notifier); + if (ret) + goto error_media_entity; + ret = v4l2_async_register_subdev(&ov13858->sd); if (ret < 0) - goto error_media_entity; + goto error_notifier_unregister; /* * Device is already turned on by i2c-core with ACPI domain PM. @@ -1761,11 +1773,17 @@ static int ov13858_probe(struct i2c_client *client, return 0; +error_notifier_unregister: + v4l2_async_notifier_unregister(&ov13858->notifier); + error_media_entity: media_entity_cleanup(&ov13858->sd.entity); error_handler_free: ov13858_free_controls(ov13858); + +error_notifier_release: + v4l2_async_notifier_release(&ov13858->notifier); dev_err(&client->dev, "%s failed:%d\n", __func__, ret); return ret; @@ -1777,6 +1795,8 @@ static int ov13858_remove(struct i2c_client *client) struct ov13858 *ov13858 = to_ov13858(sd); v4l2_async_unregister_subdev(sd); + v4l2_async_notifier_unregister(&ov13858->notifier); + v4l2_async_notifier_release(&ov13858->notifier); media_entity_cleanup(&sd->entity); ov13858_free_controls(ov13858); -- 2.11.0