clocksource/drivers/timer-cadence-ttc: fix a signedness bug in probe()

Message ID ZH7rMgjh+z3TUKGu@moroto
State New
Headers
Series clocksource/drivers/timer-cadence-ttc: fix a signedness bug in probe() |

Commit Message

Dan Carpenter June 6, 2023, 8:15 a.m. UTC
  Make the "irq" variable signed so the error handling can work.

Fixes: e932900a3279 ("arm: zynq: Use standard timer binding")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
From static analysis.  Untested.  Presumably if probe fails the system
is unbootable so I didn't bother looking at the resource leaks.

drivers/clocksource/timer-cadence-ttc.c:377 ttc_setup_clocksource() warn: 'clk' from clk_prepare_enable() not released on lines: 370.
drivers/clocksource/timer-cadence-ttc.c:466 ttc_setup_clockevent() warn: 'clk' from clk_prepare_enable() not released on lines: 466.
drivers/clocksource/timer-cadence-ttc.c:529 ttc_timer_probe() warn: 'irq' from irq_of_parse_and_map() not released on lines: 508,516,521,525.
drivers/clocksource/timer-cadence-ttc.c:529 ttc_timer_probe() warn: 'timer_baseaddr' from of_iomap() not released on lines: 498,508,516,521,525.
---
 drivers/clocksource/timer-cadence-ttc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Michal Simek June 6, 2023, 9:26 a.m. UTC | #1
On 6/6/23 10:15, Dan Carpenter wrote:
> Make the "irq" variable signed so the error handling can work.

urq_of_parse_and_map returns unsigned type.

include/linux/of_irq.h:118:extern unsigned int irq_of_parse_and_map(struct 
device_node *node, int index);

instead of this condition should be fixed to

         irq = irq_of_parse_and_map(timer, 1);
         if (!irq) {
		...

> 
> Fixes: e932900a3279 ("arm: zynq: Use standard timer binding")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
>  From static analysis.  Untested.  Presumably if probe fails the system
> is unbootable so I didn't bother looking at the resource leaks.

In the way how systems with TTC are used today that's correct assumption.

But just to be accurate system can also have different timers which could be 
used instead.

Thanks,
Michal
  
Dan Carpenter June 6, 2023, 9:39 a.m. UTC | #2
On Tue, Jun 06, 2023 at 11:26:20AM +0200, Michal Simek wrote:
> 
> 
> On 6/6/23 10:15, Dan Carpenter wrote:
> > Make the "irq" variable signed so the error handling can work.
> 
> urq_of_parse_and_map returns unsigned type.
> 

Ugh...  You're right.  This is one of those return zero on error IRQ
functions.

> include/linux/of_irq.h:118:extern unsigned int irq_of_parse_and_map(struct
> device_node *node, int index);
> 
> instead of this condition should be fixed to
> 
>         irq = irq_of_parse_and_map(timer, 1);
>         if (!irq) {
> 		...
> 

Sure.  I can resend.

regards,
dan carpenter
  

Patch

diff --git a/drivers/clocksource/timer-cadence-ttc.c b/drivers/clocksource/timer-cadence-ttc.c
index 4efd0cf3b602d..8ba1f5c2d7992 100644
--- a/drivers/clocksource/timer-cadence-ttc.c
+++ b/drivers/clocksource/timer-cadence-ttc.c
@@ -468,13 +468,13 @@  static int __init ttc_setup_clockevent(struct clk *clk,
 
 static int __init ttc_timer_probe(struct platform_device *pdev)
 {
-	unsigned int irq;
 	void __iomem *timer_baseaddr;
 	struct clk *clk_cs, *clk_ce;
 	static int initialized;
 	int clksel, ret;
 	u32 timer_width = 16;
 	struct device_node *timer = pdev->dev.of_node;
+	int irq;
 
 	if (initialized)
 		return 0;