Skip to content

Commit

Permalink
pwm: atmel-tcb: Fix resource freeing in error path and remove
Browse files Browse the repository at this point in the history
Several resources were not freed in the error path and the remove
function. Add the forgotten items.

Fixes: 34cbcd7 ("pwm: atmel-tcb: Add sama5d2 support")
Fixes: 061f857 ("pwm: atmel-tcb: Switch to new binding")
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Reviewed-by: Claudiu Beznea <claudiu.beznea@tuxon.dev>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
  • Loading branch information
ukleinek authored and thierryreding committed Jul 28, 2023
1 parent 0323e8f commit c116223
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions drivers/pwm/pwm-atmel-tcb.c
Original file line number Diff line number Diff line change
Expand Up @@ -449,16 +449,20 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)
tcbpwm->clk = of_clk_get_by_name(np->parent, clk_name);
if (IS_ERR(tcbpwm->clk))
tcbpwm->clk = of_clk_get_by_name(np->parent, "t0_clk");
if (IS_ERR(tcbpwm->clk))
return PTR_ERR(tcbpwm->clk);
if (IS_ERR(tcbpwm->clk)) {
err = PTR_ERR(tcbpwm->clk);
goto err_slow_clk;
}

match = of_match_node(atmel_tcb_of_match, np->parent);
config = match->data;

if (config->has_gclk) {
tcbpwm->gclk = of_clk_get_by_name(np->parent, "gclk");
if (IS_ERR(tcbpwm->gclk))
return PTR_ERR(tcbpwm->gclk);
if (IS_ERR(tcbpwm->gclk)) {
err = PTR_ERR(tcbpwm->gclk);
goto err_clk;
}
}

tcbpwm->chip.dev = &pdev->dev;
Expand All @@ -469,7 +473,7 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)

err = clk_prepare_enable(tcbpwm->slow_clk);
if (err)
goto err_slow_clk;
goto err_gclk;

spin_lock_init(&tcbpwm->lock);

Expand All @@ -484,6 +488,12 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev)
err_disable_clk:
clk_disable_unprepare(tcbpwm->slow_clk);

err_gclk:
clk_put(tcbpwm->gclk);

err_clk:
clk_put(tcbpwm->clk);

err_slow_clk:
clk_put(tcbpwm->slow_clk);

Expand All @@ -497,8 +507,9 @@ static void atmel_tcb_pwm_remove(struct platform_device *pdev)
pwmchip_remove(&tcbpwm->chip);

clk_disable_unprepare(tcbpwm->slow_clk);
clk_put(tcbpwm->slow_clk);
clk_put(tcbpwm->gclk);
clk_put(tcbpwm->clk);
clk_put(tcbpwm->slow_clk);
}

static const struct of_device_id atmel_tcb_pwm_dt_ids[] = {
Expand Down

0 comments on commit c116223

Please sign in to comment.