Commit 39ad07b7 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: s5c73m3-core: fix logic on a timeout condition

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: default avatarAndrzej Hajda <a.hajda@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 8239bac1
...@@ -248,17 +248,17 @@ static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value) ...@@ -248,17 +248,17 @@ static int s5c73m3_check_status(struct s5c73m3 *state, unsigned int value)
{ {
unsigned long start = jiffies; unsigned long start = jiffies;
unsigned long end = start + msecs_to_jiffies(2000); unsigned long end = start + msecs_to_jiffies(2000);
int ret = 0; int ret;
u16 status; u16 status;
int count = 0; int count = 0;
while (time_is_after_jiffies(end)) { do {
ret = s5c73m3_read(state, REG_STATUS, &status); ret = s5c73m3_read(state, REG_STATUS, &status);
if (ret < 0 || status == value) if (ret < 0 || status == value)
break; break;
usleep_range(500, 1000); usleep_range(500, 1000);
++count; ++count;
} } while (time_is_after_jiffies(end));
if (count > 0) if (count > 0)
v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd, v4l2_dbg(1, s5c73m3_dbg, &state->sensor_sd,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment