On 09/11/2017 10:00 AM, Sakari Ailus wrote: > 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> Regards, Hans > --- > 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); > >