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: Andrzej Hajda <a.hajda@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
parent
8239bac18a
commit
39ad07b7de
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue