]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: ccs: Try a little longer to access the sensor before giving up
authorSakari Ailus <sakari.ailus@linux.intel.com>
Tue, 15 Oct 2024 06:59:52 +0000 (09:59 +0300)
committerHans Verkuil <hverkuil@xs4all.nl>
Fri, 25 Apr 2025 08:15:33 +0000 (10:15 +0200)
Some sensors take longer to respond after reset than the spec-required
time. Try up to 1 s for the sensor to become accessible.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
drivers/media/i2c/ccs/ccs-core.c
drivers/media/i2c/ccs/ccs.h

index 06e0ba53f2a848794a5338182b99694f2a3ac92c..a47c56d9779ff6ccb7f9d70c27811b20ee635986 100644 (file)
@@ -1354,8 +1354,10 @@ static int ccs_change_cci_addr(struct ccs_sensor *sensor)
 
        client->addr = sensor->hwcfg.i2c_addr_dfl;
 
-       rval = ccs_write(sensor, CCI_ADDRESS_CTRL,
-                        sensor->hwcfg.i2c_addr_alt << 1);
+       rval = read_poll_timeout(ccs_write, rval, !rval, CCS_RESET_DELAY_US,
+                                CCS_RESET_TIMEOUT_US, false, sensor,
+                                CCI_ADDRESS_CTRL,
+                                sensor->hwcfg.i2c_addr_alt << 1);
        if (rval)
                return rval;
 
@@ -1575,27 +1577,25 @@ static int ccs_power_on(struct device *dev)
                if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
                        sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
                else
-                       sleep = 5000;
+                       sleep = CCS_RESET_DELAY_US;
 
                usleep_range(sleep, sleep);
        }
 
        /*
-        * Failures to respond to the address change command have been noticed.
-        * Those failures seem to be caused by the sensor requiring a longer
-        * boot time than advertised. An additional 10ms delay seems to work
-        * around the issue, but the SMIA++ I2C write retry hack makes the delay
-        * unnecessary. The failures need to be investigated to find a proper
-        * fix, and a delay will likely need to be added here if the I2C write
-        * retry hack is reverted before the root cause of the boot time issue
-        * is found.
+        * Some devices take longer than the spec-defined time to respond
+        * after reset. Try until some time has passed before flagging it
+        * an error.
         */
-
        if (!sensor->reset && !sensor->xshutdown) {
                u8 retry = 100;
                u32 reset;
 
-               rval = ccs_write(sensor, SOFTWARE_RESET, CCS_SOFTWARE_RESET_ON);
+               rval = read_poll_timeout(ccs_write, rval, !rval,
+                                        CCS_RESET_DELAY_US,
+                                        CCS_RESET_TIMEOUT_US,
+                                        false, sensor, SOFTWARE_RESET,
+                                        CCS_SOFTWARE_RESET_ON);
                if (rval < 0) {
                        dev_err(dev, "software reset failed\n");
                        goto out_cci_addr_fail;
index 096573845a10c7694f91c8ba1eeec6155d3c2ff1..0726c4687f0f4680fc35017d418005a7f531276a 100644 (file)
@@ -43,6 +43,8 @@
 #define SMIAPP_RESET_DELAY(clk)                                \
        (1000 + (SMIAPP_RESET_DELAY_CLOCKS * 1000       \
                 + (clk) / 1000 - 1) / ((clk) / 1000))
+#define CCS_RESET_DELAY_US             5000
+#define CCS_RESET_TIMEOUT_US           1000000
 
 #define CCS_COLOUR_COMPONENTS          4