summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Bara <benjamin.bara@skidata.com>2024-09-03 16:54:33 +0200
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2024-10-16 09:32:36 +0200
commita92651b8e288db2fff461c544ce9b95f6fb40ce8 (patch)
treef7917c36a6d654c9cca55ca3f7f36f4aaef2014b
parent856e89ff581d43b844e3b439070a3f3a65564aa4 (diff)
media: i2c: imx290: Avoid communication during probe()
As we don't know the mode during probe(), it doesn't make sense to update the sensors' registers with assumptions. As imx290_set_ctrl(), which is responsible for the happening communication, already ensures that there is no communication with a suspended sensor, put the sensor to suspend before calling it. To clarify the dependency of the PM runtime to the link of the subdev and the imx290 instance, put the block together. Suggested-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Benjamin Bara <benjamin.bara@skidata.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
-rw-r--r--drivers/media/i2c/imx290.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c
index 5e4aa7237152..47cfb6a9e9b5 100644
--- a/drivers/media/i2c/imx290.c
+++ b/drivers/media/i2c/imx290.c
@@ -1249,11 +1249,21 @@ static int imx290_subdev_init(struct imx290 *imx290)
imx290->current_mode = &imx290_modes_ptr(imx290)[0];
+ /*
+ * After linking the subdev with the imx290 instance, we are allowed to
+ * use the pm_runtime functions. Decrease the PM usage count. The device
+ * will get suspended after the autosuspend delay, turning the power
+ * off. However, the communication happening in imx290_ctrl_update()
+ * will already be prevented even before the delay.
+ */
v4l2_i2c_subdev_init(&imx290->sd, client, &imx290_subdev_ops);
+ imx290->sd.dev = imx290->dev;
+ pm_runtime_mark_last_busy(imx290->dev);
+ pm_runtime_put_autosuspend(imx290->dev);
+
imx290->sd.internal_ops = &imx290_internal_ops;
imx290->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE |
V4L2_SUBDEV_FL_HAS_EVENTS;
- imx290->sd.dev = imx290->dev;
imx290->sd.entity.ops = &imx290_subdev_entity_ops;
imx290->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
@@ -1598,13 +1608,6 @@ static int imx290_probe(struct i2c_client *client)
goto err_subdev;
}
- /*
- * Decrease the PM usage count. The device will get suspended after the
- * autosuspend delay, turning the power off.
- */
- pm_runtime_mark_last_busy(dev);
- pm_runtime_put_autosuspend(dev);
-
return 0;
err_subdev: