Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: sun4i-codec: Use new devm clk and reset APIs

Clean up error handling by using the new devm_
clock and reset functions. This should make it
easier to add new code, as we can eliminate the
"goto ladder" in probe().

Signed-off-by: Bence Csókás <csokas.bence@prolan.hu>
Link: https://patch.msgid.link/20250114095909.798559-1-csokas.bence@prolan.hu
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bence Csókás and committed by
Mark Brown
65880d32 41f1d2bd

+7 -35
+7 -35
sound/soc/sunxi/sun4i-codec.c
··· 2273 2273 } 2274 2274 2275 2275 /* Get the clocks from the DT */ 2276 - scodec->clk_apb = devm_clk_get(&pdev->dev, "apb"); 2276 + scodec->clk_apb = devm_clk_get_enabled(&pdev->dev, "apb"); 2277 2277 if (IS_ERR(scodec->clk_apb)) { 2278 2278 dev_err(&pdev->dev, "Failed to get the APB clock\n"); 2279 2279 return PTR_ERR(scodec->clk_apb); ··· 2286 2286 } 2287 2287 2288 2288 if (quirks->has_reset) { 2289 - scodec->rst = devm_reset_control_get_exclusive(&pdev->dev, 2290 - NULL); 2289 + scodec->rst = devm_reset_control_get_exclusive_deasserted(&pdev->dev, NULL); 2291 2290 if (IS_ERR(scodec->rst)) { 2292 2291 dev_err(&pdev->dev, "Failed to get reset control\n"); 2293 2292 return PTR_ERR(scodec->rst); ··· 2322 2323 return ret; 2323 2324 } 2324 2325 2325 - /* Enable the bus clock */ 2326 - if (clk_prepare_enable(scodec->clk_apb)) { 2327 - dev_err(&pdev->dev, "Failed to enable the APB clock\n"); 2328 - return -EINVAL; 2329 - } 2330 - 2331 - /* Deassert the reset control */ 2332 - if (scodec->rst) { 2333 - ret = reset_control_deassert(scodec->rst); 2334 - if (ret) { 2335 - dev_err(&pdev->dev, 2336 - "Failed to deassert the reset control\n"); 2337 - goto err_clk_disable; 2338 - } 2339 - } 2340 - 2341 2326 /* DMA configuration for TX FIFO */ 2342 2327 scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata; 2343 2328 scodec->playback_dma_data.maxburst = quirks->dma_max_burst; ··· 2339 2356 &sun4i_codec_dai, 1); 2340 2357 if (ret) { 2341 2358 dev_err(&pdev->dev, "Failed to register our codec\n"); 2342 - goto err_assert_reset; 2359 + return ret; 2343 2360 } 2344 2361 2345 2362 ret = devm_snd_soc_register_component(&pdev->dev, ··· 2347 2364 &dummy_cpu_dai, 1); 2348 2365 if (ret) { 2349 2366 dev_err(&pdev->dev, "Failed to register our DAI\n"); 2350 - goto err_assert_reset; 2367 + return ret; 2351 2368 } 2352 2369 2353 2370 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); 2354 2371 if (ret) { 2355 2372 dev_err(&pdev->dev, "Failed to register against DMAEngine\n"); 2356 - goto err_assert_reset; 2373 + return ret; 2357 2374 } 2358 2375 2359 2376 card = quirks->create_card(&pdev->dev); 2360 2377 if (IS_ERR(card)) { 2361 2378 ret = PTR_ERR(card); 2362 2379 dev_err(&pdev->dev, "Failed to create our card\n"); 2363 - goto err_assert_reset; 2380 + return ret; 2364 2381 } 2365 2382 2366 2383 snd_soc_card_set_drvdata(card, scodec); ··· 2368 2385 ret = snd_soc_register_card(card); 2369 2386 if (ret) { 2370 2387 dev_err_probe(&pdev->dev, ret, "Failed to register our card\n"); 2371 - goto err_assert_reset; 2388 + return ret; 2372 2389 } 2373 2390 2374 2391 return 0; 2375 - 2376 - err_assert_reset: 2377 - if (scodec->rst) 2378 - reset_control_assert(scodec->rst); 2379 - err_clk_disable: 2380 - clk_disable_unprepare(scodec->clk_apb); 2381 - return ret; 2382 2392 } 2383 2393 2384 2394 static void sun4i_codec_remove(struct platform_device *pdev) 2385 2395 { 2386 2396 struct snd_soc_card *card = platform_get_drvdata(pdev); 2387 - struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card); 2388 2397 2389 2398 snd_soc_unregister_card(card); 2390 - if (scodec->rst) 2391 - reset_control_assert(scodec->rst); 2392 - clk_disable_unprepare(scodec->clk_apb); 2393 2399 } 2394 2400 2395 2401 static struct platform_driver sun4i_codec_driver = {