[bug report] spi: add support for microchip fpga spi controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Conor Dooley,

The patch 9ac8d17694b6: "spi: add support for microchip fpga spi
controllers" from Jun 7, 2022, leads to the following Smatch static
checker warning:

	drivers/spi/spi-microchip-core.c:557 mchp_corespi_probe()
	warn: passing zero to 'PTR_ERR'

drivers/spi/spi-microchip-core.c
    506 static int mchp_corespi_probe(struct platform_device *pdev)
    507 {
    508         struct spi_master *master;
    509         struct mchp_corespi *spi;
    510         struct resource *res;
    511         u32 num_cs;
    512         int ret = 0;
    513 
    514         master = spi_alloc_master(&pdev->dev, sizeof(*spi));
    515         if (!master)
    516                 return dev_err_probe(&pdev->dev, -ENOMEM,
    517                                      "unable to allocate master for SPI controller\n");
    518 
    519         platform_set_drvdata(pdev, master);
    520 
    521         if (of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs))
    522                 num_cs = MAX_CS;
    523 
    524         master->num_chipselect = num_cs;
    525         master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
    526         master->setup = mchp_corespi_setup;
    527         master->bits_per_word_mask = SPI_BPW_MASK(8);
    528         master->transfer_one = mchp_corespi_transfer_one;
    529         master->prepare_message = mchp_corespi_prepare_message;
    530         master->set_cs = mchp_corespi_set_cs;
    531         master->dev.of_node = pdev->dev.of_node;
    532 
    533         spi = spi_master_get_devdata(master);
    534 
    535         spi->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
    536         if (IS_ERR(spi->regs)) {
    537                 ret = PTR_ERR(spi->regs);
    538                 goto error_release_master;
    539         }
    540 
    541         spi->irq = platform_get_irq(pdev, 0);
    542         if (spi->irq <= 0) {
    543                 dev_err(&pdev->dev, "invalid IRQ %d for SPI controller\n", spi->irq);
    544                 ret = spi->irq;
    545                 goto error_release_master;
    546         }
    547 
    548         ret = devm_request_irq(&pdev->dev, spi->irq, mchp_corespi_interrupt,
    549                                IRQF_SHARED, dev_name(&pdev->dev), master);
    550         if (ret) {
    551                 dev_err(&pdev->dev, "could not request irq: %d\n", ret);
    552                 goto error_release_master;
    553         }
    554 
    555         spi->clk = devm_clk_get(&pdev->dev, NULL);
    556         if (!spi->clk || IS_ERR(spi->clk)) {
                     ^^^^^^^^
NULL

--> 557                 ret = PTR_ERR(spi->clk);

ret is 0/success.

Normally when functions like this return NULL, you're supposed to just
accept the NULL and add tests for it to avoid NULL related bugs.  In
this driver if spi->clk is NULL then it leads to spi_hz == 0 which leads
to a divide by zero bug.  So it's not clear which way to go on this?
Fix the error code or add more checks for NULL?

    558                 dev_err(&pdev->dev, "could not get clk: %d\n", ret);
    559                 goto error_release_master;
    560         }
    561 
    562         ret = clk_prepare_enable(spi->clk);
    563         if (ret) {
    564                 dev_err(&pdev->dev, "failed to enable clock\n");
    565                 goto error_release_master;
    566         }
    567 
    568         mchp_corespi_init(master, spi);
    569 
    570         ret = devm_spi_register_master(&pdev->dev, master);
    571         if (ret) {
    572                 dev_err(&pdev->dev,
    573                         "unable to register master for SPI controller\n");
    574                 goto error_release_hardware;
    575         }
    576 
    577         dev_info(&pdev->dev, "Registered SPI controller %d\n", master->bus_num);
    578 
    579         return 0;
    580 
    581 error_release_hardware:
    582         mchp_corespi_disable(spi);
    583         clk_disable_unprepare(spi->clk);
    584 error_release_master:
    585         spi_master_put(master);
    586 
    587         return ret;
    588 }

regards,
dan carpenter



[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux