All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@linaro.org>
To: Sunny Luo <sunny.luo@amlogic.com>
Cc: linux-amlogic@lists.infradead.org, linux-spi@vger.kernel.org
Subject: [bug report] spi: Add Amlogic SPISG driver
Date: Fri, 1 Aug 2025 16:04:12 +0300	[thread overview]
Message-ID: <aIy7TOKt1_sdIfcH@stanley.mountain> (raw)

Hello Sunny Luo,

Commit cef9991e04ae ("spi: Add Amlogic SPISG driver") from Jul 18,
2025 (linux-next), leads to the following Smatch static checker
warning:

	drivers/spi/spi-amlogic-spisg.c:764 aml_spisg_probe()
	warn: missing unwind goto?

drivers/spi/spi-amlogic-spisg.c
    716 static int aml_spisg_probe(struct platform_device *pdev)
    717 {
    718         struct spi_controller *ctlr;
    719         struct spisg_device *spisg;
    720         struct device *dev = &pdev->dev;
    721         void __iomem *base;
    722         int ret, irq;
    723 
    724         const struct regmap_config aml_regmap_config = {
    725                 .reg_bits = 32,
    726                 .val_bits = 32,
    727                 .reg_stride = 4,
    728                 .max_register = SPISG_MAX_REG,
    729         };
    730 
    731         if (of_property_read_bool(dev->of_node, "spi-slave"))
    732                 ctlr = spi_alloc_target(dev, sizeof(*spisg));
    733         else
    734                 ctlr = spi_alloc_host(dev, sizeof(*spisg));
    735         if (!ctlr)
    736                 return dev_err_probe(dev, -ENOMEM, "controller allocation failed\n");
    737 
    738         spisg = spi_controller_get_devdata(ctlr);
    739         spisg->controller = ctlr;
    740 
    741         spisg->pdev = pdev;
    742         platform_set_drvdata(pdev, spisg);
    743 
    744         base = devm_platform_ioremap_resource(pdev, 0);
    745         if (IS_ERR(base))
    746                 return dev_err_probe(dev, PTR_ERR(base), "resource ioremap failed\n");

This should be goto out_controller

    747 
    748         spisg->map = devm_regmap_init_mmio(dev, base, &aml_regmap_config);
    749         if (IS_ERR(spisg->map))
    750                 return dev_err_probe(dev, PTR_ERR(spisg->map), "regmap init failed\n");
    751 
    752         irq = platform_get_irq(pdev, 0);
    753         if (irq < 0) {
    754                 ret = irq;
    755                 goto out_controller;
    756         }
    757 
    758         ret = device_reset_optional(dev);
    759         if (ret)
    760                 return dev_err_probe(dev, ret, "reset dev failed\n");

Same

    761 
    762         ret = aml_spisg_clk_init(spisg, base);
    763         if (ret)
--> 764                 return dev_err_probe(dev, ret, "clock init failed\n");

Same.

    765 
    766         spisg->cfg_spi = 0;
    767         spisg->cfg_start = 0;
    768         spisg->cfg_bus = 0;
    769 
    770         spisg->cfg_spi = FIELD_PREP(CFG_SFLASH_WP, 1) |
    771                          FIELD_PREP(CFG_SFLASH_HD, 1);
    772         if (spi_controller_is_target(ctlr)) {
    773                 spisg->cfg_spi |= FIELD_PREP(CFG_SLAVE_EN, 1);
    774                 spisg->cfg_bus = FIELD_PREP(CFG_TX_TUNING, 0xf);
    775         }
    776         /* default pending */
    777         spisg->cfg_start = FIELD_PREP(CFG_PEND, 1);
    778 
    779         pm_runtime_set_active(&spisg->pdev->dev);
    780         pm_runtime_enable(&spisg->pdev->dev);
    781         pm_runtime_resume_and_get(&spisg->pdev->dev);
    782 
    783         ctlr->num_chipselect = 4;
    784         ctlr->dev.of_node = pdev->dev.of_node;
    785         ctlr->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST |
    786                           SPI_3WIRE | SPI_TX_QUAD | SPI_RX_QUAD;
    787         ctlr->max_speed_hz = 1000 * 1000 * 100;
    788         ctlr->min_speed_hz = 1000 * 10;
    789         ctlr->setup = aml_spisg_setup;
    790         ctlr->cleanup = aml_spisg_cleanup;
    791         ctlr->prepare_message = aml_spisg_prepare_message;
    792         ctlr->transfer_one_message = aml_spisg_transfer_one_message;
    793         ctlr->target_abort = aml_spisg_target_abort;
    794         ctlr->can_dma = aml_spisg_can_dma;
    795         ctlr->max_dma_len = SPISG_BLOCK_MAX;
    796         ctlr->auto_runtime_pm = true;
    797 
    798         dma_set_max_seg_size(&pdev->dev, SPISG_BLOCK_MAX);
    799 
    800         ret = devm_request_irq(&pdev->dev, irq, aml_spisg_irq, 0, NULL, spisg);
    801         if (ret) {
    802                 dev_err(&pdev->dev, "irq request failed\n");
    803                 goto out_clk;
    804         }
    805 
    806         ret = devm_spi_register_controller(dev, ctlr);
    807         if (ret) {
    808                 dev_err(&pdev->dev, "spi controller registration failed\n");
    809                 goto out_clk;
    810         }
    811 
    812         init_completion(&spisg->completion);
    813 
    814         pm_runtime_put(&spisg->pdev->dev);
    815 
    816         return 0;
    817 out_clk:
    818         if (spisg->core)
    819                 clk_disable_unprepare(spisg->core);
    820         clk_disable_unprepare(spisg->pclk);
    821 out_controller:
    822         spi_controller_put(ctlr);
    823 
    824         return ret;
    825 }

regards,
dan carpenter

_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@linaro.org>
To: Sunny Luo <sunny.luo@amlogic.com>
Cc: linux-amlogic@lists.infradead.org, linux-spi@vger.kernel.org
Subject: [bug report] spi: Add Amlogic SPISG driver
Date: Fri, 1 Aug 2025 16:04:12 +0300	[thread overview]
Message-ID: <aIy7TOKt1_sdIfcH@stanley.mountain> (raw)

Hello Sunny Luo,

Commit cef9991e04ae ("spi: Add Amlogic SPISG driver") from Jul 18,
2025 (linux-next), leads to the following Smatch static checker
warning:

	drivers/spi/spi-amlogic-spisg.c:764 aml_spisg_probe()
	warn: missing unwind goto?

drivers/spi/spi-amlogic-spisg.c
    716 static int aml_spisg_probe(struct platform_device *pdev)
    717 {
    718         struct spi_controller *ctlr;
    719         struct spisg_device *spisg;
    720         struct device *dev = &pdev->dev;
    721         void __iomem *base;
    722         int ret, irq;
    723 
    724         const struct regmap_config aml_regmap_config = {
    725                 .reg_bits = 32,
    726                 .val_bits = 32,
    727                 .reg_stride = 4,
    728                 .max_register = SPISG_MAX_REG,
    729         };
    730 
    731         if (of_property_read_bool(dev->of_node, "spi-slave"))
    732                 ctlr = spi_alloc_target(dev, sizeof(*spisg));
    733         else
    734                 ctlr = spi_alloc_host(dev, sizeof(*spisg));
    735         if (!ctlr)
    736                 return dev_err_probe(dev, -ENOMEM, "controller allocation failed\n");
    737 
    738         spisg = spi_controller_get_devdata(ctlr);
    739         spisg->controller = ctlr;
    740 
    741         spisg->pdev = pdev;
    742         platform_set_drvdata(pdev, spisg);
    743 
    744         base = devm_platform_ioremap_resource(pdev, 0);
    745         if (IS_ERR(base))
    746                 return dev_err_probe(dev, PTR_ERR(base), "resource ioremap failed\n");

This should be goto out_controller

    747 
    748         spisg->map = devm_regmap_init_mmio(dev, base, &aml_regmap_config);
    749         if (IS_ERR(spisg->map))
    750                 return dev_err_probe(dev, PTR_ERR(spisg->map), "regmap init failed\n");
    751 
    752         irq = platform_get_irq(pdev, 0);
    753         if (irq < 0) {
    754                 ret = irq;
    755                 goto out_controller;
    756         }
    757 
    758         ret = device_reset_optional(dev);
    759         if (ret)
    760                 return dev_err_probe(dev, ret, "reset dev failed\n");

Same

    761 
    762         ret = aml_spisg_clk_init(spisg, base);
    763         if (ret)
--> 764                 return dev_err_probe(dev, ret, "clock init failed\n");

Same.

    765 
    766         spisg->cfg_spi = 0;
    767         spisg->cfg_start = 0;
    768         spisg->cfg_bus = 0;
    769 
    770         spisg->cfg_spi = FIELD_PREP(CFG_SFLASH_WP, 1) |
    771                          FIELD_PREP(CFG_SFLASH_HD, 1);
    772         if (spi_controller_is_target(ctlr)) {
    773                 spisg->cfg_spi |= FIELD_PREP(CFG_SLAVE_EN, 1);
    774                 spisg->cfg_bus = FIELD_PREP(CFG_TX_TUNING, 0xf);
    775         }
    776         /* default pending */
    777         spisg->cfg_start = FIELD_PREP(CFG_PEND, 1);
    778 
    779         pm_runtime_set_active(&spisg->pdev->dev);
    780         pm_runtime_enable(&spisg->pdev->dev);
    781         pm_runtime_resume_and_get(&spisg->pdev->dev);
    782 
    783         ctlr->num_chipselect = 4;
    784         ctlr->dev.of_node = pdev->dev.of_node;
    785         ctlr->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST |
    786                           SPI_3WIRE | SPI_TX_QUAD | SPI_RX_QUAD;
    787         ctlr->max_speed_hz = 1000 * 1000 * 100;
    788         ctlr->min_speed_hz = 1000 * 10;
    789         ctlr->setup = aml_spisg_setup;
    790         ctlr->cleanup = aml_spisg_cleanup;
    791         ctlr->prepare_message = aml_spisg_prepare_message;
    792         ctlr->transfer_one_message = aml_spisg_transfer_one_message;
    793         ctlr->target_abort = aml_spisg_target_abort;
    794         ctlr->can_dma = aml_spisg_can_dma;
    795         ctlr->max_dma_len = SPISG_BLOCK_MAX;
    796         ctlr->auto_runtime_pm = true;
    797 
    798         dma_set_max_seg_size(&pdev->dev, SPISG_BLOCK_MAX);
    799 
    800         ret = devm_request_irq(&pdev->dev, irq, aml_spisg_irq, 0, NULL, spisg);
    801         if (ret) {
    802                 dev_err(&pdev->dev, "irq request failed\n");
    803                 goto out_clk;
    804         }
    805 
    806         ret = devm_spi_register_controller(dev, ctlr);
    807         if (ret) {
    808                 dev_err(&pdev->dev, "spi controller registration failed\n");
    809                 goto out_clk;
    810         }
    811 
    812         init_completion(&spisg->completion);
    813 
    814         pm_runtime_put(&spisg->pdev->dev);
    815 
    816         return 0;
    817 out_clk:
    818         if (spisg->core)
    819                 clk_disable_unprepare(spisg->core);
    820         clk_disable_unprepare(spisg->pclk);
    821 out_controller:
    822         spi_controller_put(ctlr);
    823 
    824         return ret;
    825 }

regards,
dan carpenter

             reply	other threads:[~2025-08-01 13:07 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-01 13:04 Dan Carpenter [this message]
2025-08-01 13:04 ` [bug report] spi: Add Amlogic SPISG driver Dan Carpenter
  -- strict thread matches above, loose matches on Subject: below --
2025-08-04  8:14 Dan Carpenter
2025-08-04  8:14 ` Dan Carpenter
2025-08-01 13:02 Dan Carpenter
2025-08-01 13:02 ` Dan Carpenter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aIy7TOKt1_sdIfcH@stanley.mountain \
    --to=dan.carpenter@linaro.org \
    --cc=linux-amlogic@lists.infradead.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=sunny.luo@amlogic.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.