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

Subject: media: ov2740: Ensure proper reset sequence on probe()
Author:  Hans de Goede <hdego...@redhat.com>
Date:    Mon May 6 15:24:38 2024 +0200

Before this commit on probe() the driver would do:

reset=1                // from probe() calling gpiod_get(GPIOD_OUT_HIGH)
reset=0                // from resume()
msleep(20)             // from resume()

So if reset was 0 before getting the GPIO the reset line would only be
driven high for a very short time and sometimes there would be errors
reading the id register afterwards.

Add a msleep(20) after getting the reset line to ensure the sensor is
properly reset:

reset=1                // from probe() calling gpiod_get(GPIOD_OUT_HIGH)
msleep(20)             // from probe()
reset=0                // from resume()
msleep(20)             // from resume()

Signed-off-by: Hans de Goede <hdego...@redhat.com>
Tested-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
Signed-off-by: Sakari Ailus <sakari.ai...@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl>

 drivers/media/i2c/ov2740.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

---

diff --git a/drivers/media/i2c/ov2740.c b/drivers/media/i2c/ov2740.c
index 57906df7be4e..c48dbcde9877 100644
--- a/drivers/media/i2c/ov2740.c
+++ b/drivers/media/i2c/ov2740.c
@@ -1333,9 +1333,16 @@ static int ov2740_probe(struct i2c_client *client)
                return dev_err_probe(dev, ret, "failed to check HW 
configuration\n");
 
        ov2740->reset_gpio = devm_gpiod_get_optional(dev, "reset", 
GPIOD_OUT_HIGH);
-       if (IS_ERR(ov2740->reset_gpio))
+       if (IS_ERR(ov2740->reset_gpio)) {
                return dev_err_probe(dev, PTR_ERR(ov2740->reset_gpio),
                                     "failed to get reset GPIO\n");
+       } else if (ov2740->reset_gpio) {
+               /*
+                * Ensure reset is asserted for at least 20 ms before
+                * ov2740_resume() deasserts it.
+                */
+               msleep(20);
+       }
 
        ov2740->clk = devm_clk_get_optional(dev, "clk");
        if (IS_ERR(ov2740->clk))

Reply via email to