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

dmaengine: sun4i: Simplify error handling in probe()

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

Suggested-by: Chen-Yu Tsai <wens@kernel.org>
Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Acked-by: Chen-Yu Tsai <wens@csie.org>
Reviewed-by: Julian Calaby <julian.calaby@gmail.com>
Signed-off-by: Bence Csókás <csokas.bence@prolan.hu>
Link: https://lore.kernel.org/r/20250625085450.154280-2-csokas.bence@prolan.hu
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Bence Csókás and committed by
Vinod Koul
814f047f e54dd505

+13 -33
+13 -33
drivers/dma/sun4i-dma.c
··· 1249 1249 if (priv->irq < 0) 1250 1250 return priv->irq; 1251 1251 1252 - priv->clk = devm_clk_get(&pdev->dev, NULL); 1253 - if (IS_ERR(priv->clk)) { 1254 - dev_err(&pdev->dev, "No clock specified\n"); 1255 - return PTR_ERR(priv->clk); 1256 - } 1252 + priv->clk = devm_clk_get_enabled(&pdev->dev, NULL); 1253 + if (IS_ERR(priv->clk)) 1254 + return dev_err_probe(&pdev->dev, PTR_ERR(priv->clk), 1255 + "Couldn't start the clock\n"); 1257 1256 1258 1257 if (priv->cfg->has_reset) { 1259 1258 priv->rst = devm_reset_control_get_exclusive_deasserted(&pdev->dev, NULL); ··· 1327 1328 vchan_init(&vchan->vc, &priv->slave); 1328 1329 } 1329 1330 1330 - ret = clk_prepare_enable(priv->clk); 1331 - if (ret) { 1332 - dev_err(&pdev->dev, "Couldn't enable the clock\n"); 1333 - return ret; 1334 - } 1335 - 1336 1331 /* 1337 1332 * Make sure the IRQs are all disabled and accounted for. The bootloader 1338 1333 * likes to leave these dirty ··· 1336 1343 1337 1344 ret = devm_request_irq(&pdev->dev, priv->irq, sun4i_dma_interrupt, 1338 1345 0, dev_name(&pdev->dev), priv); 1339 - if (ret) { 1340 - dev_err(&pdev->dev, "Cannot request IRQ\n"); 1341 - goto err_clk_disable; 1342 - } 1346 + if (ret) 1347 + return dev_err_probe(&pdev->dev, ret, "Cannot request IRQ\n"); 1343 1348 1344 - ret = dma_async_device_register(&priv->slave); 1345 - if (ret) { 1346 - dev_warn(&pdev->dev, "Failed to register DMA engine device\n"); 1347 - goto err_clk_disable; 1348 - } 1349 + ret = dmaenginem_async_device_register(&priv->slave); 1350 + if (ret) 1351 + return dev_err_probe(&pdev->dev, ret, 1352 + "Failed to register DMA engine device\n"); 1349 1353 1350 1354 ret = of_dma_controller_register(pdev->dev.of_node, sun4i_dma_of_xlate, 1351 1355 priv); 1352 - if (ret) { 1353 - dev_err(&pdev->dev, "of_dma_controller_register failed\n"); 1354 - goto err_dma_unregister; 1355 - } 1356 + if (ret) 1357 + return dev_err_probe(&pdev->dev, ret, 1358 + "Failed to register translation function\n"); 1356 1359 1357 1360 dev_dbg(&pdev->dev, "Successfully probed SUN4I_DMA\n"); 1358 1361 1359 1362 return 0; 1360 - 1361 - err_dma_unregister: 1362 - dma_async_device_unregister(&priv->slave); 1363 - err_clk_disable: 1364 - clk_disable_unprepare(priv->clk); 1365 - return ret; 1366 1363 } 1367 1364 1368 1365 static void sun4i_dma_remove(struct platform_device *pdev) ··· 1363 1380 disable_irq(priv->irq); 1364 1381 1365 1382 of_dma_controller_free(pdev->dev.of_node); 1366 - dma_async_device_unregister(&priv->slave); 1367 - 1368 - clk_disable_unprepare(priv->clk); 1369 1383 } 1370 1384 1371 1385 static struct sun4i_dma_config sun4i_a10_dma_cfg = {