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
next 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.