clocksource/drivers/kona: Fix get_counter() error handling
I could not figure out why, but GCC cannot prove that the kona_timer_init() function always initializes its two outputs, and we get a warning for the use of the 'lsw' variable later, which is obviously correct. drivers/clocksource/bcm_kona_timer.c: In function 'kona_timer_init': drivers/clocksource/bcm_kona_timer.c:119:13: error: 'lsw' may be used uninitialized in this function [-Werror=maybe-uninitialized] Slightly reordering the loop makes the warning disappear, after it becomes more obvious to the compiler that the loop is always entered on the first iteration. As pointed out by Ray Jui, there is a related problem in the way we deal with the loop running into the limit, as we just keep going there with an invalid counter data, so instead we now propagate a -ETIMEDOUT result to the caller. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Acked-by: Ray Jui <ray.jui@broadcom.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: bcm-kernel-feedback-list@broadcom.com Link: http://lkml.kernel.org/r/1471429296-9053-2-git-send-email-daniel.lezcano@linaro.org Link: https://patchwork.kernel.org/patch/9174261/ Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
0e62fd836e
commit
16c8eba0fe
|
@ -66,10 +66,10 @@ static void kona_timer_disable_and_clear(void __iomem *base)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
|
kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
|
||||||
{
|
{
|
||||||
int loop_limit = 4;
|
int loop_limit = 3;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read 64-bit free running counter
|
* Read 64-bit free running counter
|
||||||
|
@ -83,18 +83,19 @@ kona_timer_get_counter(void __iomem *timer_base, uint32_t *msw, uint32_t *lsw)
|
||||||
* if new hi-word is equal to previously read hi-word then stop.
|
* if new hi-word is equal to previously read hi-word then stop.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while (--loop_limit) {
|
do {
|
||||||
*msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
|
*msw = readl(timer_base + KONA_GPTIMER_STCHI_OFFSET);
|
||||||
*lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
|
*lsw = readl(timer_base + KONA_GPTIMER_STCLO_OFFSET);
|
||||||
if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
|
if (*msw == readl(timer_base + KONA_GPTIMER_STCHI_OFFSET))
|
||||||
break;
|
break;
|
||||||
}
|
} while (--loop_limit);
|
||||||
if (!loop_limit) {
|
if (!loop_limit) {
|
||||||
pr_err("bcm_kona_timer: getting counter failed.\n");
|
pr_err("bcm_kona_timer: getting counter failed.\n");
|
||||||
pr_err(" Timer will be impacted\n");
|
pr_err(" Timer will be impacted\n");
|
||||||
|
return -ETIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kona_timer_set_next_event(unsigned long clc,
|
static int kona_timer_set_next_event(unsigned long clc,
|
||||||
|
@ -112,8 +113,11 @@ static int kona_timer_set_next_event(unsigned long clc,
|
||||||
|
|
||||||
uint32_t lsw, msw;
|
uint32_t lsw, msw;
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
kona_timer_get_counter(timers.tmr_regs, &msw, &lsw);
|
ret = kona_timer_get_counter(timers.tmr_regs, &msw, &lsw);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* Load the "next" event tick value */
|
/* Load the "next" event tick value */
|
||||||
writel(lsw + clc, timers.tmr_regs + KONA_GPTIMER_STCM0_OFFSET);
|
writel(lsw + clc, timers.tmr_regs + KONA_GPTIMER_STCM0_OFFSET);
|
||||||
|
|
Loading…
Reference in New Issue