Skip to content

Commit 0cf3489

Browse files
CassivsGabriellisbroonie
authored andcommitted
ASoC: codecs: rk3328: Use managed GPIO and clock helpers
rk3328_platform_probe() acquires the mute GPIO with gpiod_get_optional() but never releases it. It also enables mclk and pclk manually while relying on probe error labels for unwind, and the driver has no platform remove callback to disable those clocks after a successful unbind. This path has already needed fixes for missing clock unwinds on probe errors. Use devm_gpiod_get_optional() and devm_clk_get_enabled() so the GPIO and enabled clock lifetimes are tied to the device. This removes the manual error labels and makes both probe failure and driver unbind follow the normal devres cleanup path. Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> Link: https://patch.msgid.link/20260525-asoc-rk3328-devm-resources-v1-1-2abde0006f89@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 2d90ecd commit 0cf3489

1 file changed

Lines changed: 13 additions & 41 deletions

File tree

sound/soc/codecs/rk3328_codec.c

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,6 @@ static int rk3328_platform_probe(struct platform_device *pdev)
425425
struct rk3328_codec_priv *rk3328;
426426
struct regmap *grf;
427427
void __iomem *base;
428-
int ret = 0;
429428

430429
rk3328 = devm_kzalloc(&pdev->dev, sizeof(*rk3328), GFP_KERNEL);
431430
if (!rk3328)
@@ -441,14 +440,13 @@ static int rk3328_platform_probe(struct platform_device *pdev)
441440
regmap_write(grf, RK3328_GRF_SOC_CON2,
442441
(BIT(14) << 16 | BIT(14)));
443442

444-
ret = of_property_read_u32(rk3328_np, "spk-depop-time-ms",
445-
&rk3328->spk_depop_time);
446-
if (ret < 0) {
443+
if (of_property_read_u32(rk3328_np, "spk-depop-time-ms",
444+
&rk3328->spk_depop_time)) {
447445
dev_info(&pdev->dev, "spk_depop_time use default value.\n");
448446
rk3328->spk_depop_time = 200;
449447
}
450448

451-
rk3328->mute = gpiod_get_optional(&pdev->dev, "mute", GPIOD_OUT_HIGH);
449+
rk3328->mute = devm_gpiod_get_optional(&pdev->dev, "mute", GPIOD_OUT_HIGH);
452450
if (IS_ERR(rk3328->mute))
453451
return PTR_ERR(rk3328->mute);
454452
/*
@@ -461,57 +459,31 @@ static int rk3328_platform_probe(struct platform_device *pdev)
461459
regmap_write(grf, RK3328_GRF_SOC_CON10, BIT(17) | BIT(1));
462460
}
463461

464-
rk3328->mclk = devm_clk_get(&pdev->dev, "mclk");
462+
rk3328->mclk = devm_clk_get_enabled(&pdev->dev, "mclk");
465463
if (IS_ERR(rk3328->mclk))
466464
return PTR_ERR(rk3328->mclk);
467465

468-
ret = clk_prepare_enable(rk3328->mclk);
469-
if (ret)
470-
return ret;
471466
clk_set_rate(rk3328->mclk, INITIAL_FREQ);
472467

473-
rk3328->pclk = devm_clk_get(&pdev->dev, "pclk");
474-
if (IS_ERR(rk3328->pclk)) {
475-
dev_err(&pdev->dev, "can't get acodec pclk\n");
476-
ret = PTR_ERR(rk3328->pclk);
477-
goto err_unprepare_mclk;
478-
}
479-
480-
ret = clk_prepare_enable(rk3328->pclk);
481-
if (ret < 0) {
482-
dev_err(&pdev->dev, "failed to enable acodec pclk\n");
483-
goto err_unprepare_mclk;
484-
}
468+
rk3328->pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
469+
if (IS_ERR(rk3328->pclk))
470+
return dev_err_probe(&pdev->dev, PTR_ERR(rk3328->pclk),
471+
"failed to get or enable acodec pclk\n");
485472

486473
base = devm_platform_ioremap_resource(pdev, 0);
487-
if (IS_ERR(base)) {
488-
ret = PTR_ERR(base);
489-
goto err_unprepare_pclk;
490-
}
474+
if (IS_ERR(base))
475+
return PTR_ERR(base);
491476

492477
rk3328->regmap = devm_regmap_init_mmio(&pdev->dev, base,
493478
&rk3328_codec_regmap_config);
494-
if (IS_ERR(rk3328->regmap)) {
495-
ret = PTR_ERR(rk3328->regmap);
496-
goto err_unprepare_pclk;
497-
}
479+
if (IS_ERR(rk3328->regmap))
480+
return PTR_ERR(rk3328->regmap);
498481

499482
platform_set_drvdata(pdev, rk3328);
500483

501-
ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328,
484+
return devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328,
502485
rk3328_dai,
503486
ARRAY_SIZE(rk3328_dai));
504-
if (ret)
505-
goto err_unprepare_pclk;
506-
507-
return 0;
508-
509-
err_unprepare_pclk:
510-
clk_disable_unprepare(rk3328->pclk);
511-
512-
err_unprepare_mclk:
513-
clk_disable_unprepare(rk3328->mclk);
514-
return ret;
515487
}
516488

517489
static const struct of_device_id rk3328_codec_of_match[] __maybe_unused = {

0 commit comments

Comments
 (0)