Skip to content

Commit f68b27d

Browse files
hanxu-nxpgregkh
authored andcommitted
spi: fsl-qspi: use devm function instead of driver remove
[ Upstream commit 40369bf ] Driver use devm APIs to manage clk/irq/resources and register the spi controller, but the legacy remove function will be called first during device detach and trigger kernel panic. Drop the remove function and use devm_add_action_or_reset() for driver cleanup to ensure the release sequence. Trigger kernel panic on i.MX8MQ by echo 30bb0000.spi >/sys/bus/platform/drivers/fsl-quadspi/unbind Cc: stable@vger.kernel.org Fixes: 8fcb830 ("spi: spi-fsl-qspi: use devm_spi_register_controller") Reported-by: Kevin Hao <haokexin@gmail.com> Signed-off-by: Han Xu <han.xu@nxp.com> Reviewed-by: Frank Li <Frank.Li@nxp.com> Link: https://patch.msgid.link/20250326224152.2147099-1-han.xu@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 442312c commit f68b27d

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

drivers/spi/spi-fsl-qspi.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,19 @@ static const struct spi_controller_mem_ops fsl_qspi_mem_ops = {
839839
.get_name = fsl_qspi_get_name,
840840
};
841841

842+
static void fsl_qspi_cleanup(void *data)
843+
{
844+
struct fsl_qspi *q = data;
845+
846+
/* disable the hardware */
847+
qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
848+
qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
849+
850+
fsl_qspi_clk_disable_unprep(q);
851+
852+
mutex_destroy(&q->lock);
853+
}
854+
842855
static int fsl_qspi_probe(struct platform_device *pdev)
843856
{
844857
struct spi_controller *ctlr;
@@ -928,6 +941,10 @@ static int fsl_qspi_probe(struct platform_device *pdev)
928941

929942
ctlr->dev.of_node = np;
930943

944+
ret = devm_add_action_or_reset(dev, fsl_qspi_cleanup, q);
945+
if (ret)
946+
goto err_destroy_mutex;
947+
931948
ret = devm_spi_register_controller(dev, ctlr);
932949
if (ret)
933950
goto err_destroy_mutex;
@@ -947,19 +964,6 @@ static int fsl_qspi_probe(struct platform_device *pdev)
947964
return ret;
948965
}
949966

950-
static void fsl_qspi_remove(struct platform_device *pdev)
951-
{
952-
struct fsl_qspi *q = platform_get_drvdata(pdev);
953-
954-
/* disable the hardware */
955-
qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
956-
qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
957-
958-
fsl_qspi_clk_disable_unprep(q);
959-
960-
mutex_destroy(&q->lock);
961-
}
962-
963967
static int fsl_qspi_suspend(struct device *dev)
964968
{
965969
return 0;
@@ -997,7 +1001,6 @@ static struct platform_driver fsl_qspi_driver = {
9971001
.pm = &fsl_qspi_pm_ops,
9981002
},
9991003
.probe = fsl_qspi_probe,
1000-
.remove_new = fsl_qspi_remove,
10011004
};
10021005
module_platform_driver(fsl_qspi_driver);
10031006

0 commit comments

Comments
 (0)