From c6d94963333d6377382f26a480e687492f5a9174 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Thu, 13 Mar 2025 13:12:59 +0200 Subject: [PATCH 1/2] spi: sg2044-nor: Fully convert to device managed resources The driver has a wrong order of the cleaning up the resources, i.e. it first will destroy the mutex and only then free the SPI which might still use it. Fix this by switching to devm_mutex_init(). Signed-off-by: Andy Shevchenko Link: https://patch.msgid.link/20250313111423.322775-2-andriy.shevchenko@linux.intel.com Signed-off-by: Mark Brown --- drivers/spi/spi-sg2044-nor.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/drivers/spi/spi-sg2044-nor.c b/drivers/spi/spi-sg2044-nor.c index 454153a63b42..95822f2fc521 100644 --- a/drivers/spi/spi-sg2044-nor.c +++ b/drivers/spi/spi-sg2044-nor.c @@ -425,6 +425,7 @@ static void sg2044_spifmc_init(struct sg2044_spifmc *spifmc) static int sg2044_spifmc_probe(struct platform_device *pdev) { + struct device *dev = &pdev->dev; struct spi_controller *ctrl; struct sg2044_spifmc *spifmc; void __iomem *base; @@ -435,7 +436,6 @@ static int sg2044_spifmc_probe(struct platform_device *pdev) return -ENOMEM; spifmc = spi_controller_get_devdata(ctrl); - dev_set_drvdata(&pdev->dev, ctrl); spifmc->clk = devm_clk_get_enabled(&pdev->dev, NULL); if (IS_ERR(spifmc->clk)) @@ -457,14 +457,15 @@ static int sg2044_spifmc_probe(struct platform_device *pdev) ctrl->mem_ops = &sg2044_spifmc_mem_ops; ctrl->mode_bits = SPI_RX_DUAL | SPI_TX_DUAL | SPI_RX_QUAD | SPI_TX_QUAD; - mutex_init(&spifmc->lock); + ret = devm_mutex_init(dev, &spifmc->lock); + if (ret) + return ret; sg2044_spifmc_init(spifmc); sg2044_spifmc_init_reg(spifmc); ret = devm_spi_register_controller(&pdev->dev, ctrl); if (ret) { - mutex_destroy(&spifmc->lock); dev_err(&pdev->dev, "spi_register_controller failed\n"); return ret; } @@ -472,13 +473,6 @@ static int sg2044_spifmc_probe(struct platform_device *pdev) return 0; } -static void sg2044_spifmc_remove(struct platform_device *pdev) -{ - struct sg2044_spifmc *spifmc = platform_get_drvdata(pdev); - - mutex_destroy(&spifmc->lock); -} - static const struct of_device_id sg2044_spifmc_match[] = { { .compatible = "sophgo,sg2044-spifmc-nor" }, { /* sentinel */ } @@ -491,7 +485,6 @@ static struct platform_driver sg2044_nor_driver = { .of_match_table = sg2044_spifmc_match, }, .probe = sg2044_spifmc_probe, - .remove = sg2044_spifmc_remove, }; module_platform_driver(sg2044_nor_driver); From 085cf53d71b9406d646c9f3f24876a36a68ef4e9 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Thu, 13 Mar 2025 13:13:00 +0200 Subject: [PATCH 2/2] spi: sg2044-nor: Convert to dev_err_probe() One of the cases in sg2044_spifmc_probe() may be converted to use dev_err_probe(). Do it. While at it, use local device pointer in all such calls and drop unneeded __func__ parameter as dev_err_probe() is assumed to be called only during probe phase. Signed-off-by: Andy Shevchenko Link: https://patch.msgid.link/20250313111423.322775-3-andriy.shevchenko@linux.intel.com Signed-off-by: Mark Brown --- drivers/spi/spi-sg2044-nor.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/drivers/spi/spi-sg2044-nor.c b/drivers/spi/spi-sg2044-nor.c index 95822f2fc521..d3582c84538e 100644 --- a/drivers/spi/spi-sg2044-nor.c +++ b/drivers/spi/spi-sg2044-nor.c @@ -439,9 +439,7 @@ static int sg2044_spifmc_probe(struct platform_device *pdev) spifmc->clk = devm_clk_get_enabled(&pdev->dev, NULL); if (IS_ERR(spifmc->clk)) - return dev_err_probe(&pdev->dev, PTR_ERR(spifmc->clk), - "%s: Cannot get and enable AHB clock\n", - __func__); + return dev_err_probe(dev, PTR_ERR(spifmc->clk), "Cannot get and enable AHB clock\n"); spifmc->dev = &pdev->dev; spifmc->ctrl = ctrl; @@ -465,10 +463,8 @@ static int sg2044_spifmc_probe(struct platform_device *pdev) sg2044_spifmc_init_reg(spifmc); ret = devm_spi_register_controller(&pdev->dev, ctrl); - if (ret) { - dev_err(&pdev->dev, "spi_register_controller failed\n"); - return ret; - } + if (ret) + return dev_err_probe(dev, ret, "spi_register_controller failed\n"); return 0; }