Skip to content

Commit 9f7cd1b

Browse files
hanxu-nxpbroonie
authored andcommitted
spi: nxp-fspi: use devm instead of remove for driver detach
fspi 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. Signed-off-by: Han Xu <[email protected]> Signed-off-by: Haibo Chen <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent e0558eb commit 9f7cd1b

File tree

1 file changed

+22
-19
lines changed

1 file changed

+22
-19
lines changed

drivers/spi/spi-nxp-fspi.c

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,24 @@ static const struct spi_controller_mem_caps nxp_fspi_mem_caps = {
11681168
.per_op_freq = true,
11691169
};
11701170

1171+
static void nxp_fspi_cleanup(void *data)
1172+
{
1173+
struct nxp_fspi *f = data;
1174+
1175+
/* enable clock first since there is register access */
1176+
pm_runtime_get_sync(f->dev);
1177+
1178+
/* disable the hardware */
1179+
fspi_writel(f, FSPI_MCR0_MDIS, f->iobase + FSPI_MCR0);
1180+
1181+
pm_runtime_disable(f->dev);
1182+
pm_runtime_put_noidle(f->dev);
1183+
nxp_fspi_clk_disable_unprep(f);
1184+
1185+
if (f->ahb_addr)
1186+
iounmap(f->ahb_addr);
1187+
}
1188+
11711189
static int nxp_fspi_probe(struct platform_device *pdev)
11721190
{
11731191
struct spi_controller *ctlr;
@@ -1263,25 +1281,11 @@ static int nxp_fspi_probe(struct platform_device *pdev)
12631281
ctlr->mem_caps = &nxp_fspi_mem_caps;
12641282
ctlr->dev.of_node = np;
12651283

1266-
return devm_spi_register_controller(&pdev->dev, ctlr);
1267-
}
1268-
1269-
static void nxp_fspi_remove(struct platform_device *pdev)
1270-
{
1271-
struct nxp_fspi *f = platform_get_drvdata(pdev);
1272-
1273-
/* enable clock first since there is reigster access */
1274-
pm_runtime_get_sync(f->dev);
1275-
1276-
/* disable the hardware */
1277-
fspi_writel(f, FSPI_MCR0_MDIS, f->iobase + FSPI_MCR0);
1278-
1279-
pm_runtime_disable(f->dev);
1280-
pm_runtime_put_noidle(f->dev);
1281-
nxp_fspi_clk_disable_unprep(f);
1284+
ret = devm_add_action_or_reset(dev, nxp_fspi_cleanup, f);
1285+
if (ret)
1286+
return dev_err_probe(dev, ret, "Failed to register nxp_fspi_cleanup\n");
12821287

1283-
if (f->ahb_addr)
1284-
iounmap(f->ahb_addr);
1288+
return devm_spi_register_controller(&pdev->dev, ctlr);
12851289
}
12861290

12871291
static int nxp_fspi_runtime_suspend(struct device *dev)
@@ -1361,7 +1365,6 @@ static struct platform_driver nxp_fspi_driver = {
13611365
.pm = pm_ptr(&nxp_fspi_pm_ops),
13621366
},
13631367
.probe = nxp_fspi_probe,
1364-
.remove = nxp_fspi_remove,
13651368
};
13661369
module_platform_driver(nxp_fspi_driver);
13671370

0 commit comments

Comments
 (0)