This is an automatic generated email to let you know that the following patch 
were queued:

Subject: drivers: media: max96717: stop the csi receiver before the source
Author:  Julien Massot <julien.mas...@collabora.com>
Date:    Tue Apr 30 15:19:31 2024 +0200

Stopping the CSI source before stopping the serializer
CSI port may make the serializer not respond.
Then all the next writes to the device will fail.

max96717 1-0040: Error writing reg 0x0308: -121
max96717 1-0040: Error writing reg 0x0006: -121

Fix that by stopping the CSI receiver first and then CSI source.

Seen on max96717f revision 4.

Signed-off-by: Julien Massot <julien.mas...@collabora.com>
Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>

 drivers/media/i2c/max96717.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

---

diff --git a/drivers/media/i2c/max96717.c b/drivers/media/i2c/max96717.c
index 62df822a193f..949306485873 100644
--- a/drivers/media/i2c/max96717.c
+++ b/drivers/media/i2c/max96717.c
@@ -384,24 +384,23 @@ static int max96717_disable_streams(struct v4l2_subdev 
*sd,
 {
        struct max96717_priv *priv = sd_to_max96717(sd);
        u64 sink_streams;
-       int ret;
+
+       /*
+        * Stop the CSI receiver first then the source,
+        * otherwise the device may become unresponsive
+        * while holding the I2C bus low.
+        */
+       priv->enabled_source_streams &= ~streams_mask;
+       if (!priv->enabled_source_streams)
+               max96717_start_csi(priv, false);
 
        sink_streams = v4l2_subdev_state_xlate_streams(state,
                                                       MAX96717_PAD_SOURCE,
                                                       MAX96717_PAD_SINK,
                                                       &streams_mask);
 
-       ret = v4l2_subdev_disable_streams(priv->source_sd, priv->source_sd_pad,
-                                         sink_streams);
-       if (ret)
-               return ret;
-
-       priv->enabled_source_streams &= ~streams_mask;
-
-       if (!priv->enabled_source_streams)
-               max96717_start_csi(priv, false);
-
-       return 0;
+       return v4l2_subdev_disable_streams(priv->source_sd, priv->source_sd_pad,
+                                          sink_streams);
 }
 
 static const struct v4l2_subdev_pad_ops max96717_pad_ops = {

Reply via email to