Thread (14 messages) 14 messages, 1 author, 2017-09-12
DORMANTno replies REVIEWED: 1 (0M)
Revisions (3)
  1. v9 [diff vs current]
  2. v11 current
  3. v15 [diff vs current]

[PATCH v11 23/24] ov13858: Add support for flash and lens devices

From: Sakari Ailus <sakari.ailus@linux.intel.com>
Date: 2017-09-12 08:42:35
Also in: linux-media
Subsystem: media input infrastructure (v4l/dvb), omnivision ov13858 sensor driver, the rest, v4l2 camera sensor drivers · Maintainers: Mauro Carvalho Chehab, Sakari Ailus, Linus Torvalds

Parse async sub-devices by using
v4l2_subdev_fwnode_reference_parse_sensor_common().

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Hans Verkuil <redacted>
---
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help