| From: Dan Carpenter <dan.carpenter@oracle.com> |
| Date: Fri, 25 Nov 2016 14:25:54 +0300 |
| Subject: sparc: leon: Fix a retry loop in leon_init_timers() |
| |
| commit 601e6e3cc5bf6adb7d076fe24d10f6191a25ba9b upstream. |
| |
| The original code causes a static checker warning because it has a |
| continue inside a do { } while (0); loop. In that context, a continue |
| and a break are equivalent. The intent was to go back to the start of |
| the loop so the continue was a bug. |
| |
| I've added a retry label at the start and changed the continue to a goto |
| retry. Then I removed the do { } while (0) loop and pulled the code in |
| one indent level. |
| |
| Fixes: 2791c1a43900 ("SPARC/LEON: added support for selecting Timer Core and Timer within core") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/sparc/kernel/leon_kernel.c | 56 ++++++++++++++++++++--------------------- |
| 1 file changed, 28 insertions(+), 28 deletions(-) |
| |
| --- a/arch/sparc/kernel/leon_kernel.c |
| +++ b/arch/sparc/kernel/leon_kernel.c |
| @@ -339,37 +339,37 @@ void __init leon_init_timers(void) |
| |
| /* Find GPTIMER Timer Registers base address otherwise bail out. */ |
| nnp = rootnp; |
| - do { |
| - np = of_find_node_by_name(nnp, "GAISLER_GPTIMER"); |
| - if (!np) { |
| - np = of_find_node_by_name(nnp, "01_011"); |
| - if (!np) |
| - goto bad; |
| - } |
| |
| - ampopts = 0; |
| - pp = of_find_property(np, "ampopts", &len); |
| - if (pp) { |
| - ampopts = *(int *)pp->value; |
| - if (ampopts == 0) { |
| - /* Skip this instance, resource already |
| - * allocated by other OS */ |
| - nnp = np; |
| - continue; |
| - } |
| +retry: |
| + np = of_find_node_by_name(nnp, "GAISLER_GPTIMER"); |
| + if (!np) { |
| + np = of_find_node_by_name(nnp, "01_011"); |
| + if (!np) |
| + goto bad; |
| + } |
| + |
| + ampopts = 0; |
| + pp = of_find_property(np, "ampopts", &len); |
| + if (pp) { |
| + ampopts = *(int *)pp->value; |
| + if (ampopts == 0) { |
| + /* Skip this instance, resource already |
| + * allocated by other OS */ |
| + nnp = np; |
| + goto retry; |
| } |
| + } |
| |
| - /* Select Timer-Instance on Timer Core. Default is zero */ |
| - leon3_gptimer_idx = ampopts & 0x7; |
| + /* Select Timer-Instance on Timer Core. Default is zero */ |
| + leon3_gptimer_idx = ampopts & 0x7; |
| |
| - pp = of_find_property(np, "reg", &len); |
| - if (pp) |
| - leon3_gptimer_regs = *(struct leon3_gptimer_regs_map **) |
| - pp->value; |
| - pp = of_find_property(np, "interrupts", &len); |
| - if (pp) |
| - leon3_gptimer_irq = *(unsigned int *)pp->value; |
| - } while (0); |
| + pp = of_find_property(np, "reg", &len); |
| + if (pp) |
| + leon3_gptimer_regs = *(struct leon3_gptimer_regs_map **) |
| + pp->value; |
| + pp = of_find_property(np, "interrupts", &len); |
| + if (pp) |
| + leon3_gptimer_irq = *(unsigned int *)pp->value; |
| |
| if (!(leon3_gptimer_regs && leon3_irqctrl_regs && leon3_gptimer_irq)) |
| goto bad; |