Re: [PATCH v4 2/3] dma: amlogic: Add general DMA driver for A9
From: Dan Carpenter
Date: Mon Mar 02 2026 - 03:46:23 EST
Hi Xianwei,
kernel test robot noticed the following build warnings:
url: https://github.com/intel-lab-lkp/linux/commits/Xianwei-Zhao-via-B4-Relay/dt-bindings-dma-Add-Amlogic-A9-SoC-DMA/20260227-152743
base: 6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f
patch link: https://lore.kernel.org/r/20260227-amlogic-dma-v4-2-f25e4614e9b7%40amlogic.com
patch subject: [PATCH v4 2/3] dma: amlogic: Add general DMA driver for A9
config: arm-randconfig-r073-20260228 (https://download.01.org/0day-ci/archive/20260302/202603020642.3hq2CxZ7-lkp@xxxxxxxxx/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
smatch version: v0.5.0-8994-gd50c5a4c
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
| Closes: https://lore.kernel.org/r/202603020642.3hq2CxZ7-lkp@xxxxxxxxx/
New smatch warnings:
drivers/dma/amlogic-dma.c:354 aml_dma_interrupt_handler() warn: variable dereferenced before check 'aml_chan' (see line 353)
drivers/dma/amlogic-dma.c:483 aml_dma_probe() warn: passing zero to 'PTR_ERR'
Old smatch warnings:
drivers/dma/amlogic-dma.c:384 aml_dma_interrupt_handler() warn: variable dereferenced before check 'aml_chan' (see line 383)
vim +/aml_chan +354 drivers/dma/amlogic-dma.c
c01d15789f1d15b Xianwei Zhao 2026-02-27 335 static irqreturn_t aml_dma_interrupt_handler(int irq, void *dev_id)
c01d15789f1d15b Xianwei Zhao 2026-02-27 336 {
c01d15789f1d15b Xianwei Zhao 2026-02-27 337 struct aml_dma_dev *aml_dma = dev_id;
c01d15789f1d15b Xianwei Zhao 2026-02-27 338 struct aml_dma_chan *aml_chan;
c01d15789f1d15b Xianwei Zhao 2026-02-27 339 u32 done, eoc_done, err, err_l, end;
c01d15789f1d15b Xianwei Zhao 2026-02-27 340 int i = 0;
c01d15789f1d15b Xianwei Zhao 2026-02-27 341
c01d15789f1d15b Xianwei Zhao 2026-02-27 342 /* deal with rch normal complete and error */
c01d15789f1d15b Xianwei Zhao 2026-02-27 343 regmap_read(aml_dma->regmap, RCH_DONE, &done);
c01d15789f1d15b Xianwei Zhao 2026-02-27 344 regmap_read(aml_dma->regmap, RCH_ERR, &err);
c01d15789f1d15b Xianwei Zhao 2026-02-27 345 regmap_read(aml_dma->regmap, RCH_LEN_ERR, &err_l);
c01d15789f1d15b Xianwei Zhao 2026-02-27 346 err = err | err_l;
c01d15789f1d15b Xianwei Zhao 2026-02-27 347
c01d15789f1d15b Xianwei Zhao 2026-02-27 348 done = done | err;
c01d15789f1d15b Xianwei Zhao 2026-02-27 349
c01d15789f1d15b Xianwei Zhao 2026-02-27 350 while (done) {
c01d15789f1d15b Xianwei Zhao 2026-02-27 351 i = ffs(done) - 1;
c01d15789f1d15b Xianwei Zhao 2026-02-27 352 aml_chan = aml_dma->aml_rch[i];
c01d15789f1d15b Xianwei Zhao 2026-02-27 @353 regmap_write(aml_dma->regmap, CLEAR_RCH, BIT(aml_chan->chan_id));
^^^^^^^^^^^^^^^^^^
Move this dereference
c01d15789f1d15b Xianwei Zhao 2026-02-27 @354 if (!aml_chan) {
^^^^^^^^
after this NULL check?
c01d15789f1d15b Xianwei Zhao 2026-02-27 355 dev_err(aml_dma->dma_device.dev, "idx %d rch not initialized\n", i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 356 done &= ~BIT(i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 357 continue;
c01d15789f1d15b Xianwei Zhao 2026-02-27 358 }
c01d15789f1d15b Xianwei Zhao 2026-02-27 359 aml_chan->status = (err & (1 << i)) ? DMA_ERROR : DMA_COMPLETE;
c01d15789f1d15b Xianwei Zhao 2026-02-27 360 dma_cookie_complete(&aml_chan->desc);
c01d15789f1d15b Xianwei Zhao 2026-02-27 361 dmaengine_desc_get_callback_invoke(&aml_chan->desc, NULL);
c01d15789f1d15b Xianwei Zhao 2026-02-27 362 done &= ~BIT(i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 363 }
c01d15789f1d15b Xianwei Zhao 2026-02-27 364
c01d15789f1d15b Xianwei Zhao 2026-02-27 365 /* deal with wch normal complete and error */
c01d15789f1d15b Xianwei Zhao 2026-02-27 366 regmap_read(aml_dma->regmap, DMA_BATCH_END, &end);
c01d15789f1d15b Xianwei Zhao 2026-02-27 367 if (end)
c01d15789f1d15b Xianwei Zhao 2026-02-27 368 regmap_write(aml_dma->regmap, CLEAR_W_BATCH, end);
c01d15789f1d15b Xianwei Zhao 2026-02-27 369
c01d15789f1d15b Xianwei Zhao 2026-02-27 370 regmap_read(aml_dma->regmap, WCH_DONE, &done);
c01d15789f1d15b Xianwei Zhao 2026-02-27 371 regmap_read(aml_dma->regmap, WCH_EOC_DONE, &eoc_done);
c01d15789f1d15b Xianwei Zhao 2026-02-27 372 done = done | eoc_done;
c01d15789f1d15b Xianwei Zhao 2026-02-27 373
c01d15789f1d15b Xianwei Zhao 2026-02-27 374 regmap_read(aml_dma->regmap, WCH_ERR, &err);
c01d15789f1d15b Xianwei Zhao 2026-02-27 375 regmap_read(aml_dma->regmap, WDMA_RESP_ERR, &err_l);
c01d15789f1d15b Xianwei Zhao 2026-02-27 376 err = err | err_l;
c01d15789f1d15b Xianwei Zhao 2026-02-27 377
c01d15789f1d15b Xianwei Zhao 2026-02-27 378 done = done | err;
c01d15789f1d15b Xianwei Zhao 2026-02-27 379 i = 0;
c01d15789f1d15b Xianwei Zhao 2026-02-27 380 while (done) {
c01d15789f1d15b Xianwei Zhao 2026-02-27 381 i = ffs(done) - 1;
c01d15789f1d15b Xianwei Zhao 2026-02-27 382 aml_chan = aml_dma->aml_wch[i];
c01d15789f1d15b Xianwei Zhao 2026-02-27 383 regmap_write(aml_dma->regmap, CLEAR_WCH, BIT(aml_chan->chan_id));
c01d15789f1d15b Xianwei Zhao 2026-02-27 384 if (!aml_chan) {
Same.
c01d15789f1d15b Xianwei Zhao 2026-02-27 385 dev_err(aml_dma->dma_device.dev, "idx %d wch not initialized\n", i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 386 done &= ~BIT(i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 387 continue;
c01d15789f1d15b Xianwei Zhao 2026-02-27 388 }
c01d15789f1d15b Xianwei Zhao 2026-02-27 389 aml_chan->status = (err & (1 << i)) ? DMA_ERROR : DMA_COMPLETE;
c01d15789f1d15b Xianwei Zhao 2026-02-27 390 dma_cookie_complete(&aml_chan->desc);
c01d15789f1d15b Xianwei Zhao 2026-02-27 391 dmaengine_desc_get_callback_invoke(&aml_chan->desc, NULL);
c01d15789f1d15b Xianwei Zhao 2026-02-27 392 done &= ~BIT(i);
c01d15789f1d15b Xianwei Zhao 2026-02-27 393 }
c01d15789f1d15b Xianwei Zhao 2026-02-27 394
c01d15789f1d15b Xianwei Zhao 2026-02-27 395 return IRQ_HANDLED;
c01d15789f1d15b Xianwei Zhao 2026-02-27 396 }
[ snip ]
c01d15789f1d15b Xianwei Zhao 2026-02-27 450 static int aml_dma_probe(struct platform_device *pdev)
c01d15789f1d15b Xianwei Zhao 2026-02-27 451 {
c01d15789f1d15b Xianwei Zhao 2026-02-27 452 struct device_node *np = pdev->dev.of_node;
c01d15789f1d15b Xianwei Zhao 2026-02-27 453 struct dma_device *dma_dev;
c01d15789f1d15b Xianwei Zhao 2026-02-27 454 struct aml_dma_dev *aml_dma;
c01d15789f1d15b Xianwei Zhao 2026-02-27 455 int ret, i, len;
c01d15789f1d15b Xianwei Zhao 2026-02-27 456 u32 chan_nr;
c01d15789f1d15b Xianwei Zhao 2026-02-27 457
c01d15789f1d15b Xianwei Zhao 2026-02-27 458 const struct regmap_config aml_regmap_config = {
c01d15789f1d15b Xianwei Zhao 2026-02-27 459 .reg_bits = 32,
c01d15789f1d15b Xianwei Zhao 2026-02-27 460 .val_bits = 32,
c01d15789f1d15b Xianwei Zhao 2026-02-27 461 .reg_stride = 4,
c01d15789f1d15b Xianwei Zhao 2026-02-27 462 .max_register = 0x3000,
c01d15789f1d15b Xianwei Zhao 2026-02-27 463 };
c01d15789f1d15b Xianwei Zhao 2026-02-27 464
c01d15789f1d15b Xianwei Zhao 2026-02-27 465 ret = of_property_read_u32(np, "dma-channels", &chan_nr);
c01d15789f1d15b Xianwei Zhao 2026-02-27 466 if (ret)
c01d15789f1d15b Xianwei Zhao 2026-02-27 467 return dev_err_probe(&pdev->dev, ret, "failed to read dma-channels\n");
c01d15789f1d15b Xianwei Zhao 2026-02-27 468
c01d15789f1d15b Xianwei Zhao 2026-02-27 469 len = sizeof(struct aml_dma_dev) + sizeof(struct aml_dma_chan) * chan_nr;
c01d15789f1d15b Xianwei Zhao 2026-02-27 470 aml_dma = devm_kzalloc(&pdev->dev, len, GFP_KERNEL);
c01d15789f1d15b Xianwei Zhao 2026-02-27 471 if (!aml_dma)
c01d15789f1d15b Xianwei Zhao 2026-02-27 472 return -ENOMEM;
c01d15789f1d15b Xianwei Zhao 2026-02-27 473
c01d15789f1d15b Xianwei Zhao 2026-02-27 474 aml_dma->chan_nr = chan_nr;
c01d15789f1d15b Xianwei Zhao 2026-02-27 475
c01d15789f1d15b Xianwei Zhao 2026-02-27 476 aml_dma->base = devm_platform_ioremap_resource(pdev, 0);
c01d15789f1d15b Xianwei Zhao 2026-02-27 477 if (IS_ERR(aml_dma->base))
c01d15789f1d15b Xianwei Zhao 2026-02-27 478 return PTR_ERR(aml_dma->base);
c01d15789f1d15b Xianwei Zhao 2026-02-27 479
c01d15789f1d15b Xianwei Zhao 2026-02-27 480 aml_dma->regmap = devm_regmap_init_mmio(&pdev->dev, aml_dma->base,
c01d15789f1d15b Xianwei Zhao 2026-02-27 481 &aml_regmap_config);
c01d15789f1d15b Xianwei Zhao 2026-02-27 482 if (IS_ERR_OR_NULL(aml_dma->regmap))
This should just be if (IS_ERR(aml_dma->regmap)) since
devm_regmap_init_mmio() can't return NULL.
https://staticthinking.wordpress.com/2022/08/01/mixing-error-pointers-and-null/
c01d15789f1d15b Xianwei Zhao 2026-02-27 @483 return PTR_ERR(aml_dma->regmap);
c01d15789f1d15b Xianwei Zhao 2026-02-27 484
c01d15789f1d15b Xianwei Zhao 2026-02-27 485 aml_dma->clk = devm_clk_get_enabled(&pdev->dev, NULL);
c01d15789f1d15b Xianwei Zhao 2026-02-27 486 if (IS_ERR(aml_dma->clk))
c01d15789f1d15b Xianwei Zhao 2026-02-27 487 return PTR_ERR(aml_dma->clk);
c01d15789f1d15b Xianwei Zhao 2026-02-27 488
c01d15789f1d15b Xianwei Zhao 2026-02-27 489 aml_dma->irq = platform_get_irq(pdev, 0);
c01d15789f1d15b Xianwei Zhao 2026-02-27 490
c01d15789f1d15b Xianwei Zhao 2026-02-27 491 aml_dma->pdev = pdev;
c01d15789f1d15b Xianwei Zhao 2026-02-27 492 aml_dma->dma_device.dev = &pdev->dev;
c01d15789f1d15b Xianwei Zhao 2026-02-27 493
c01d15789f1d15b Xianwei Zhao 2026-02-27 494 dma_dev = &aml_dma->dma_device;
c01d15789f1d15b Xianwei Zhao 2026-02-27 495 INIT_LIST_HEAD(&dma_dev->channels);
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki