]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: zynq-qspi: fix controller deregistration
authorJohan Hovold <johan@kernel.org>
Fri, 10 Apr 2026 08:17:56 +0000 (10:17 +0200)
committerMark Brown <broonie@kernel.org>
Fri, 10 Apr 2026 12:22:45 +0000 (13:22 +0100)
Make sure to deregister the controller before disabling it during driver
unbind.

Note that clocks were also disabled before the recent commit
1f8fd9490e31 ("spi: zynq-qspi: Simplify clock handling with
devm_clk_get_enabled()").

Fixes: 67dca5e580f1 ("spi: spi-mem: Add support for Zynq QSPI controller")
Cc: stable@vger.kernel.org # 5.2: 8eb2fd00f65a
Cc: stable@vger.kernel.org # 5.2
Cc: Naga Sureshkumar Relli <naga.sureshkumar.relli@xilinx.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Link: https://patch.msgid.link/20260410081757.503099-27-johan@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-zynq-qspi.c

index af252500195ce27417c8c57df92c6a492e221705..406fd9d5337eec90f73dd8f021fe95a0345642fe 100644 (file)
@@ -643,7 +643,7 @@ static int zynq_qspi_probe(struct platform_device *pdev)
 
        xqspi = spi_controller_get_devdata(ctlr);
        xqspi->dev = dev;
-       platform_set_drvdata(pdev, xqspi);
+       platform_set_drvdata(pdev, ctlr);
        xqspi->regs = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(xqspi->regs)) {
                ret = PTR_ERR(xqspi->regs);
@@ -702,9 +702,9 @@ static int zynq_qspi_probe(struct platform_device *pdev)
        /* QSPI controller initializations */
        zynq_qspi_init_hw(xqspi, ctlr->num_chipselect);
 
-       ret = devm_spi_register_controller(&pdev->dev, ctlr);
+       ret = spi_register_controller(ctlr);
        if (ret) {
-               dev_err(&pdev->dev, "devm_spi_register_controller failed\n");
+               dev_err(&pdev->dev, "failed to register controller\n");
                goto remove_ctlr;
        }
 
@@ -728,9 +728,16 @@ remove_ctlr:
  */
 static void zynq_qspi_remove(struct platform_device *pdev)
 {
-       struct zynq_qspi *xqspi = platform_get_drvdata(pdev);
+       struct spi_controller *ctlr = platform_get_drvdata(pdev);
+       struct zynq_qspi *xqspi = spi_controller_get_devdata(ctlr);
+
+       spi_controller_get(ctlr);
+
+       spi_unregister_controller(ctlr);
 
        zynq_qspi_write(xqspi, ZYNQ_QSPI_ENABLE_OFFSET, 0);
+
+       spi_controller_put(ctlr);
 }
 
 static const struct of_device_id zynq_qspi_of_match[] = {