media: s5c73m3-core: fix logic on a timeout condition
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 19 Dec 2017 11:43:37 +0000 (06:43 -0500)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 7 Mar 2018 10:55:05 +0000 (05:55 -0500)
As warned by smatch:
drivers/media/i2c/s5c73m3/s5c73m3-core.c:268 s5c73m3_check_status() error: uninitialized symbol 'status'.

if s5c73m3_check_status() is called too late, time_is_after_jiffies(end)
will return 0, causing the while to abort before reading status.

The current code will do the wrong thing here, as it will still
check if status != value. The right fix here is to change
the logic to ensure that it will always read the status.

Suggested-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/i2c/s5c73m3/s5c73m3-core.c

index cdc4f2392ef9a089f982c61865aa2fa948fca401..ce196b60f9170d219de213187aaef1cd26057c12 100644 (file)
@@ -248,17 +248,17 @@ static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value)
 {
        unsigned long start = jiffies;
        unsigned long end = start + msecs_to_jiffies(2000);
-       int ret = 0;
+       int ret;
        u16 status;
        int count = 0;
 
-       while (time_is_after_jiffies(end)) {
+       do {
                ret = s5c73m3_read(state, REG_STATUS, &status);
                if (ret < 0 || status == value)
                        break;
                usleep_range(500, 1000);
                ++count;
-       }
+       } while (time_is_after_jiffies(end));
 
        if (count > 0)
                v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,