* [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled
@ 2026-03-18 2:39 Pei Xiao
2026-03-18 2:39 ` [PATCH v4 01/17] spi: axiado: Simplify clock management with devm_clk_get_enabled() Pei Xiao
` (16 more replies)
0 siblings, 17 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
I know that many old SPI drivers should not be modified for hardware
stability and to reduce maintenance effort. But I can't help cleaning them
up. To minimize the introduction of issues, I tried not to modify the
timing of those hardware clock enables.
---
changes in v4: modify all commit info
changes in v3: remove disable clk in remove function
changes in v2: fix error message but having a line break
Missing error code argument to dev_err_probe()
---
Pei Xiao (17):
spi: axiado: Simplify clock management with devm_clk_get_enabled()
spi: bcm63xx-hsspi: Simplify clock handling with
devm_clk_get_enabled()
spi: bcmbca-hsspi: Simplify clock handling with devm_clk_get_enabled()
spi: img-spfi: Simplify clock handling with devm_clk_get_enabled()
spi: imx: Simplify clock handling with devm_clk_get_enabled()
spi: npcm-pspi: Simplify clock handling with devm_clk_get_enabled()
spi: orion: Simplify clock handling with devm_clk_get_enabled()
spi: rockchip-sfc: Simplify clock handling with devm_clk_get_enabled()
spi: sifive: Simplify clock handling with devm_clk_get_enabled()
spi: slave-mt27xx: Simplify clock handling with devm_clk_get_enabled()
spi: st: Simplify clock handling with devm_clk_get_enabled()
spi: stm32-qspi: Simplify clock handling with devm_clk_get_enabled()
spi: stm32: Simplify clock handling with devm_clk_get_enabled()
spi: sunplus-sp7021: Simplify clock handling with
devm_clk_get_enabled()
spi: uniphier: Simplify clock handling with devm_clk_get_enabled()
spi: zynq-qspi: Simplify clock handling with devm_clk_get_enabled()
spi: zynqmp-gqspi: Simplify clock handling with devm_clk_get_enabled()
drivers/spi/spi-axiado.c | 31 +++++-----------
drivers/spi/spi-bcm63xx-hsspi.c | 46 +++++++-----------------
drivers/spi/spi-bcmbca-hsspi.c | 49 +++++++++----------------
drivers/spi/spi-img-spfi.c | 18 ++--------
drivers/spi/spi-imx.c | 15 ++------
drivers/spi/spi-npcm-pspi.c | 20 ++++-------
drivers/spi/spi-orion.c | 11 ++----
drivers/spi/spi-rockchip-sfc.c | 22 ++----------
drivers/spi/spi-sifive.c | 21 ++++-------
drivers/spi/spi-slave-mt27xx.c | 8 +----
drivers/spi/spi-st-ssc4.c | 16 +++------
drivers/spi/spi-stm32-qspi.c | 18 +++-------
drivers/spi/spi-stm32.c | 61 ++++++++++----------------------
drivers/spi/spi-sunplus-sp7021.c | 15 +-------
drivers/spi/spi-uniphier.c | 17 +++------
drivers/spi/spi-zynq-qspi.c | 31 ++++------------
drivers/spi/spi-zynqmp-gqspi.c | 19 ++--------
17 files changed, 98 insertions(+), 320 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v4 01/17] spi: axiado: Simplify clock management with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 02/17] spi: bcm63xx-hsspi: Simplify clock handling " Pei Xiao
` (15 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both the "pclk" and "ref" clocks. This
reduces boilerplate code and error handling, as the managed API
automatically disables the clocks when the device is removed or if
probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback. Rename the error label
from 'clk_dis_all' to 'err_disable_pm_runtime' to reflect that only
PM runtime cleanup remains.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-axiado.c | 31 ++++++++-----------------------
1 file changed, 8 insertions(+), 23 deletions(-)
diff --git a/drivers/spi/spi-axiado.c b/drivers/spi/spi-axiado.c
index dc55c55ae63c..b2d1011357f4 100644
--- a/drivers/spi/spi-axiado.c
+++ b/drivers/spi/spi-axiado.c
@@ -768,25 +768,15 @@ static int ax_spi_probe(struct platform_device *pdev)
if (IS_ERR(xspi->regs))
return PTR_ERR(xspi->regs);
- xspi->pclk = devm_clk_get(&pdev->dev, "pclk");
+ xspi->pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
if (IS_ERR(xspi->pclk))
return dev_err_probe(&pdev->dev, PTR_ERR(xspi->pclk),
- "pclk clock not found.\n");
+ "Unable to enable APB clock.\n");
- xspi->ref_clk = devm_clk_get(&pdev->dev, "ref");
+ xspi->ref_clk = devm_clk_get_enabled(&pdev->dev, "ref");
if (IS_ERR(xspi->ref_clk))
return dev_err_probe(&pdev->dev, PTR_ERR(xspi->ref_clk),
- "ref clock not found.\n");
-
- ret = clk_prepare_enable(xspi->pclk);
- if (ret)
- return dev_err_probe(&pdev->dev, ret, "Unable to enable APB clock.\n");
-
- ret = clk_prepare_enable(xspi->ref_clk);
- if (ret) {
- dev_err(&pdev->dev, "Unable to enable device clock.\n");
- goto clk_dis_apb;
- }
+ "Unable to enable device clock.\n");
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
@@ -815,7 +805,7 @@ static int ax_spi_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq <= 0) {
ret = -ENXIO;
- goto clk_dis_all;
+ goto err_disable_pm_runtime;
}
ret = devm_request_irq(&pdev->dev, irq, ax_spi_irq,
@@ -823,7 +813,7 @@ static int ax_spi_probe(struct platform_device *pdev)
if (ret != 0) {
ret = -ENXIO;
dev_err(&pdev->dev, "request_irq failed\n");
- goto clk_dis_all;
+ goto err_disable_pm_runtime;
}
ctlr->use_gpio_descriptors = true;
@@ -849,17 +839,14 @@ static int ax_spi_probe(struct platform_device *pdev)
ret = spi_register_controller(ctlr);
if (ret) {
dev_err(&pdev->dev, "spi_register_controller failed\n");
- goto clk_dis_all;
+ goto err_disable_pm_runtime;
}
return ret;
-clk_dis_all:
+err_disable_pm_runtime:
pm_runtime_set_suspended(&pdev->dev);
pm_runtime_disable(&pdev->dev);
- clk_disable_unprepare(xspi->ref_clk);
-clk_dis_apb:
- clk_disable_unprepare(xspi->pclk);
return ret;
}
@@ -882,8 +869,6 @@ static void ax_spi_remove(struct platform_device *pdev)
pm_runtime_set_suspended(&pdev->dev);
pm_runtime_disable(&pdev->dev);
- clk_disable_unprepare(xspi->ref_clk);
- clk_disable_unprepare(xspi->pclk);
}
/**
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 02/17] spi: bcm63xx-hsspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
2026-03-18 2:39 ` [PATCH v4 01/17] spi: axiado: Simplify clock management with devm_clk_get_enabled() Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 03/17] spi: bcmbca-hsspi: " Pei Xiao
` (14 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both the "hsspi" and "pll" clocks. This
reduces boilerplate code and error handling, as the managed API
automatically disables the clocks when the device is removed or if
probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback. Accordingly, adjust the
error handling labels to direct returns where possible.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-bcm63xx-hsspi.c | 46 +++++++++------------------------
1 file changed, 12 insertions(+), 34 deletions(-)
diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
index 612f8802e690..266eabd3715b 100644
--- a/drivers/spi/spi-bcm63xx-hsspi.c
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
@@ -758,8 +758,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
if (IS_ERR(regs))
return PTR_ERR(regs);
- clk = devm_clk_get(dev, "hsspi");
-
+ clk = devm_clk_get_enabled(dev, "hsspi");
if (IS_ERR(clk))
return PTR_ERR(clk);
@@ -767,41 +766,26 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
if (IS_ERR(reset))
return PTR_ERR(reset);
- ret = clk_prepare_enable(clk);
- if (ret)
- return ret;
-
ret = reset_control_reset(reset);
- if (ret) {
- dev_err(dev, "unable to reset device: %d\n", ret);
- goto out_disable_clk;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "unable to reset device: %d\n", ret);
rate = clk_get_rate(clk);
if (!rate) {
- pll_clk = devm_clk_get(dev, "pll");
-
- if (IS_ERR(pll_clk)) {
- ret = PTR_ERR(pll_clk);
- goto out_disable_clk;
- }
-
- ret = clk_prepare_enable(pll_clk);
- if (ret)
- goto out_disable_clk;
+ pll_clk = devm_clk_get_enabled(dev, "pll");
+ if (IS_ERR(pll_clk))
+ return dev_err_probe(dev, PTR_ERR(pll_clk),
+ "failed enable pll clk\n");
rate = clk_get_rate(pll_clk);
- if (!rate) {
- ret = -EINVAL;
- goto out_disable_pll_clk;
- }
+ if (!rate)
+ return dev_err_probe(dev, -EINVAL,
+ "failed get pll clk rate\n");
}
host = spi_alloc_host(&pdev->dev, sizeof(*bs));
- if (!host) {
- ret = -ENOMEM;
- goto out_disable_pll_clk;
- }
+ if (!host)
+ return dev_err_probe(dev, -ENOMEM, "alloc host no mem\n");
bs = spi_controller_get_devdata(host);
bs->pdev = pdev;
@@ -887,10 +871,6 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev);
out_put_host:
spi_controller_put(host);
-out_disable_pll_clk:
- clk_disable_unprepare(pll_clk);
-out_disable_clk:
- clk_disable_unprepare(clk);
return ret;
}
@@ -902,8 +882,6 @@ static void bcm63xx_hsspi_remove(struct platform_device *pdev)
/* reset the hardware and block queue progress */
__raw_writel(0, bs->regs + HSSPI_INT_MASK_REG);
- clk_disable_unprepare(bs->pll_clk);
- clk_disable_unprepare(bs->clk);
sysfs_remove_group(&pdev->dev.kobj, &bcm63xx_hsspi_group);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 03/17] spi: bcmbca-hsspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
2026-03-18 2:39 ` [PATCH v4 01/17] spi: axiado: Simplify clock management with devm_clk_get_enabled() Pei Xiao
2026-03-18 2:39 ` [PATCH v4 02/17] spi: bcm63xx-hsspi: Simplify clock handling " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 04/17] spi: img-spfi: " Pei Xiao
` (13 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both the "hsspi" and "pll" clocks. This
reduces boilerplate code and error handling, as the managed API
automatically disables the clocks when the device is removed or if
probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback. Simplify the error handling
by converting to direct returns with dev_err_probe() where appropriate.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-bcmbca-hsspi.c | 49 +++++++++++-----------------------
1 file changed, 16 insertions(+), 33 deletions(-)
diff --git a/drivers/spi/spi-bcmbca-hsspi.c b/drivers/spi/spi-bcmbca-hsspi.c
index ece22260f570..2e22345115fd 100644
--- a/drivers/spi/spi-bcmbca-hsspi.c
+++ b/drivers/spi/spi-bcmbca-hsspi.c
@@ -452,39 +452,30 @@ static int bcmbca_hsspi_probe(struct platform_device *pdev)
if (IS_ERR(spim_ctrl))
return PTR_ERR(spim_ctrl);
- clk = devm_clk_get(dev, "hsspi");
+ clk = devm_clk_get_enabled(dev, "hsspi");
if (IS_ERR(clk))
- return PTR_ERR(clk);
-
- ret = clk_prepare_enable(clk);
- if (ret)
- return ret;
+ return dev_err_probe(dev, PTR_ERR(clk),
+ "Failed to get hsspi clock\n");
rate = clk_get_rate(clk);
if (!rate) {
- pll_clk = devm_clk_get(dev, "pll");
+ pll_clk = devm_clk_get_enabled(dev, "pll");
if (IS_ERR(pll_clk)) {
- ret = PTR_ERR(pll_clk);
- goto out_disable_clk;
+ return dev_err_probe(dev, PTR_ERR(pll_clk),
+ "Failed to get pll clock\n");
}
- ret = clk_prepare_enable(pll_clk);
- if (ret)
- goto out_disable_clk;
-
rate = clk_get_rate(pll_clk);
- if (!rate) {
- ret = -EINVAL;
- goto out_disable_pll_clk;
- }
+ if (!rate)
+ return dev_err_probe(dev, -EINVAL,
+ "Failed to get pll clock rate\n");
}
host = devm_spi_alloc_host(&pdev->dev, sizeof(*bs));
- if (!host) {
- ret = -ENOMEM;
- goto out_disable_pll_clk;
- }
+ if (!host)
+ return dev_err_probe(dev, -ENOMEM,
+ "Failed alloc spi host\n");
bs = spi_controller_get_devdata(host);
bs->pdev = pdev;
@@ -535,18 +526,16 @@ static int bcmbca_hsspi_probe(struct platform_device *pdev)
ret = devm_request_irq(dev, irq, bcmbca_hsspi_interrupt, IRQF_SHARED,
pdev->name, bs);
if (ret)
- goto out_disable_pll_clk;
+ return dev_err_probe(dev, ret, "Failed request irq\n");
}
ret = devm_pm_runtime_enable(&pdev->dev);
if (ret)
- goto out_disable_pll_clk;
+ return dev_err_probe(dev, ret, "Failed pm runtime enable\n");
ret = sysfs_create_group(&pdev->dev.kobj, &bcmbca_hsspi_group);
- if (ret) {
- dev_err(&pdev->dev, "couldn't register sysfs group\n");
- goto out_disable_pll_clk;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "couldn't register sysfs group\n");
/* register and we are done */
ret = devm_spi_register_controller(dev, host);
@@ -559,10 +548,6 @@ static int bcmbca_hsspi_probe(struct platform_device *pdev)
out_sysgroup_disable:
sysfs_remove_group(&pdev->dev.kobj, &bcmbca_hsspi_group);
-out_disable_pll_clk:
- clk_disable_unprepare(pll_clk);
-out_disable_clk:
- clk_disable_unprepare(clk);
return ret;
}
@@ -573,8 +558,6 @@ static void bcmbca_hsspi_remove(struct platform_device *pdev)
/* reset the hardware and block queue progress */
__raw_writel(0, bs->regs + HSSPI_INT_MASK_REG);
- clk_disable_unprepare(bs->pll_clk);
- clk_disable_unprepare(bs->clk);
sysfs_remove_group(&pdev->dev.kobj, &bcmbca_hsspi_group);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 04/17] spi: img-spfi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (2 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 03/17] spi: bcmbca-hsspi: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 05/17] spi: imx: " Pei Xiao
` (12 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both "sys" and "spfi" clocks. This reduces
boilerplate code and error handling, as the managed API automatically
disables the clocks when the device is removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-img-spfi.c | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c
index 902fb64815c9..b45c6ceaffe2 100644
--- a/drivers/spi/spi-img-spfi.c
+++ b/drivers/spi/spi-img-spfi.c
@@ -557,24 +557,17 @@ static int img_spfi_probe(struct platform_device *pdev)
if (ret)
goto put_spi;
- spfi->sys_clk = devm_clk_get(spfi->dev, "sys");
+ spfi->sys_clk = devm_clk_get_enabled(spfi->dev, "sys");
if (IS_ERR(spfi->sys_clk)) {
ret = PTR_ERR(spfi->sys_clk);
goto put_spi;
}
- spfi->spfi_clk = devm_clk_get(spfi->dev, "spfi");
+ spfi->spfi_clk = devm_clk_get_enabled(spfi->dev, "spfi");
if (IS_ERR(spfi->spfi_clk)) {
ret = PTR_ERR(spfi->spfi_clk);
goto put_spi;
}
- ret = clk_prepare_enable(spfi->sys_clk);
- if (ret)
- goto put_spi;
- ret = clk_prepare_enable(spfi->spfi_clk);
- if (ret)
- goto disable_pclk;
-
spfi_reset(spfi);
/*
* Only enable the error (IACCESS) interrupt. In PIO mode we'll
@@ -655,9 +648,6 @@ static int img_spfi_probe(struct platform_device *pdev)
dma_release_channel(spfi->rx_ch);
if (spfi->tx_ch)
dma_release_channel(spfi->tx_ch);
- clk_disable_unprepare(spfi->spfi_clk);
-disable_pclk:
- clk_disable_unprepare(spfi->sys_clk);
put_spi:
spi_controller_put(host);
@@ -675,10 +665,6 @@ static void img_spfi_remove(struct platform_device *pdev)
dma_release_channel(spfi->rx_ch);
pm_runtime_disable(spfi->dev);
- if (!pm_runtime_status_suspended(spfi->dev)) {
- clk_disable_unprepare(spfi->spfi_clk);
- clk_disable_unprepare(spfi->sys_clk);
- }
}
#ifdef CONFIG_PM
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 05/17] spi: imx: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (3 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 04/17] spi: img-spfi: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 13:45 ` Frank Li
2026-03-18 2:39 ` [PATCH v4 06/17] spi: npcm-pspi: " Pei Xiao
` (11 subsequent siblings)
16 siblings, 1 reply; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both "ipg" and "per" clocks. This reduces
boilerplate code and error handling, as the managed API automatically
disables the clocks when the device is removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-imx.c | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
index 64c6c09e1e7b..a01c466818de 100644
--- a/drivers/spi/spi-imx.c
+++ b/drivers/spi/spi-imx.c
@@ -2323,26 +2323,18 @@ static int spi_imx_probe(struct platform_device *pdev)
goto out_controller_put;
}
- spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
+ spi_imx->clk_ipg = devm_clk_get_enabled(&pdev->dev, "ipg");
if (IS_ERR(spi_imx->clk_ipg)) {
ret = PTR_ERR(spi_imx->clk_ipg);
goto out_controller_put;
}
- spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
+ spi_imx->clk_per = devm_clk_get_enabled(&pdev->dev, "per");
if (IS_ERR(spi_imx->clk_per)) {
ret = PTR_ERR(spi_imx->clk_per);
goto out_controller_put;
}
- ret = clk_prepare_enable(spi_imx->clk_per);
- if (ret)
- goto out_controller_put;
-
- ret = clk_prepare_enable(spi_imx->clk_ipg);
- if (ret)
- goto out_put_per;
-
pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
pm_runtime_use_autosuspend(spi_imx->dev);
pm_runtime_get_noresume(spi_imx->dev);
@@ -2386,9 +2378,6 @@ static int spi_imx_probe(struct platform_device *pdev)
pm_runtime_disable(spi_imx->dev);
pm_runtime_set_suspended(&pdev->dev);
- clk_disable_unprepare(spi_imx->clk_ipg);
-out_put_per:
- clk_disable_unprepare(spi_imx->clk_per);
out_controller_put:
spi_controller_put(controller);
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 06/17] spi: npcm-pspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (4 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 05/17] spi: imx: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 07/17] spi: orion: " Pei Xiao
` (10 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This reduces boilerplate code
and error handling, as the managed API automatically disables the clock
when the device is removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error path and the remove callback. Adjust error handling labels
accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-npcm-pspi.c | 20 ++++++--------------
1 file changed, 6 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-npcm-pspi.c b/drivers/spi/spi-npcm-pspi.c
index e60b3cc398ec..ae7f9a70fbcf 100644
--- a/drivers/spi/spi-npcm-pspi.c
+++ b/drivers/spi/spi-npcm-pspi.c
@@ -361,27 +361,23 @@ static int npcm_pspi_probe(struct platform_device *pdev)
goto out_host_put;
}
- priv->clk = devm_clk_get(&pdev->dev, NULL);
+ priv->clk = devm_clk_get_enabled(&pdev->dev, NULL);
if (IS_ERR(priv->clk)) {
- dev_err(&pdev->dev, "failed to get clock\n");
+ dev_err(&pdev->dev, "failed to enable clock\n");
ret = PTR_ERR(priv->clk);
goto out_host_put;
}
- ret = clk_prepare_enable(priv->clk);
- if (ret)
- goto out_host_put;
-
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
ret = irq;
- goto out_disable_clk;
+ goto out_host_put;
}
priv->reset = devm_reset_control_get(&pdev->dev, NULL);
if (IS_ERR(priv->reset)) {
ret = PTR_ERR(priv->reset);
- goto out_disable_clk;
+ goto out_host_put;
}
/* reset SPI-HW block */
@@ -391,7 +387,7 @@ static int npcm_pspi_probe(struct platform_device *pdev)
"npcm-pspi", priv);
if (ret) {
dev_err(&pdev->dev, "failed to request IRQ\n");
- goto out_disable_clk;
+ goto out_host_put;
}
init_completion(&priv->xfer_done);
@@ -415,15 +411,12 @@ static int npcm_pspi_probe(struct platform_device *pdev)
ret = devm_spi_register_controller(&pdev->dev, host);
if (ret)
- goto out_disable_clk;
+ goto out_host_put;
pr_info("NPCM Peripheral SPI %d probed\n", host->bus_num);
return 0;
-out_disable_clk:
- clk_disable_unprepare(priv->clk);
-
out_host_put:
spi_controller_put(host);
return ret;
@@ -435,7 +428,6 @@ static void npcm_pspi_remove(struct platform_device *pdev)
struct npcm_pspi *priv = spi_controller_get_devdata(host);
npcm_pspi_reset_hw(priv);
- clk_disable_unprepare(priv->clk);
}
static const struct of_device_id npcm_pspi_match[] = {
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 07/17] spi: orion: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (5 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 06/17] spi: npcm-pspi: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 08/17] spi: rockchip-sfc: " Pei Xiao
` (9 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the "axi" clock. This reduces
boilerplate code and error handling, as the managed API automatically
disables the clock when the device is removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() call from the
probe error path and the remove callback. Adjust error handling labels
accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-orion.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
index 7a2186b51b4c..d884a18c95a6 100644
--- a/drivers/spi/spi-orion.c
+++ b/drivers/spi/spi-orion.c
@@ -695,13 +695,11 @@ static int orion_spi_probe(struct platform_device *pdev)
}
/* The following clock is only used by some SoCs */
- spi->axi_clk = devm_clk_get(&pdev->dev, "axi");
+ spi->axi_clk = devm_clk_get_enabled(&pdev->dev, "axi");
if (PTR_ERR(spi->axi_clk) == -EPROBE_DEFER) {
status = -EPROBE_DEFER;
goto out;
}
- if (!IS_ERR(spi->axi_clk))
- clk_prepare_enable(spi->axi_clk);
tclk_hz = clk_get_rate(spi->clk);
@@ -726,7 +724,7 @@ static int orion_spi_probe(struct platform_device *pdev)
spi->base = devm_platform_get_and_ioremap_resource(pdev, 0, &r);
if (IS_ERR(spi->base)) {
status = PTR_ERR(spi->base);
- goto out_rel_axi_clk;
+ goto out;
}
for_each_available_child_of_node(pdev->dev.of_node, np) {
@@ -764,7 +762,7 @@ static int orion_spi_probe(struct platform_device *pdev)
if (!dir_acc->vaddr) {
status = -ENOMEM;
of_node_put(np);
- goto out_rel_axi_clk;
+ goto out;
}
dir_acc->size = PAGE_SIZE;
@@ -788,8 +786,6 @@ static int orion_spi_probe(struct platform_device *pdev)
out_rel_pm:
pm_runtime_disable(&pdev->dev);
-out_rel_axi_clk:
- clk_disable_unprepare(spi->axi_clk);
out:
spi_controller_put(host);
return status;
@@ -802,7 +798,6 @@ static void orion_spi_remove(struct platform_device *pdev)
struct orion_spi *spi = spi_controller_get_devdata(host);
pm_runtime_get_sync(&pdev->dev);
- clk_disable_unprepare(spi->axi_clk);
spi_unregister_controller(host);
pm_runtime_disable(&pdev->dev);
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 08/17] spi: rockchip-sfc: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (6 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 07/17] spi: orion: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:39 ` [PATCH v4 09/17] spi: sifive: " Pei Xiao
` (8 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both the interface clock "clk_sfc" and the
AHB clock "hclk_sfc". This reduces boilerplate code and error handling,
as the managed API automatically disables the clocks when the device is
removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error paths and the remove callback. Adjust error handling labels
accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-rockchip-sfc.c | 22 ++--------------------
1 file changed, 2 insertions(+), 20 deletions(-)
diff --git a/drivers/spi/spi-rockchip-sfc.c b/drivers/spi/spi-rockchip-sfc.c
index 174995042f53..b32b7c015edb 100644
--- a/drivers/spi/spi-rockchip-sfc.c
+++ b/drivers/spi/spi-rockchip-sfc.c
@@ -635,13 +635,13 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
return PTR_ERR(sfc->regbase);
if (!has_acpi_companion(&pdev->dev))
- sfc->clk = devm_clk_get(&pdev->dev, "clk_sfc");
+ sfc->clk = devm_clk_get_enabled(&pdev->dev, "clk_sfc");
if (IS_ERR(sfc->clk))
return dev_err_probe(&pdev->dev, PTR_ERR(sfc->clk),
"Failed to get sfc interface clk\n");
if (!has_acpi_companion(&pdev->dev))
- sfc->hclk = devm_clk_get(&pdev->dev, "hclk_sfc");
+ sfc->hclk = devm_clk_get_enabled(&pdev->dev, "hclk_sfc");
if (IS_ERR(sfc->hclk))
return dev_err_probe(&pdev->dev, PTR_ERR(sfc->hclk),
"Failed to get sfc ahb clk\n");
@@ -657,18 +657,6 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
sfc->use_dma = !of_property_read_bool(sfc->dev->of_node, "rockchip,sfc-no-dma");
- ret = clk_prepare_enable(sfc->hclk);
- if (ret) {
- dev_err(&pdev->dev, "Failed to enable ahb clk\n");
- goto err_hclk;
- }
-
- ret = clk_prepare_enable(sfc->clk);
- if (ret) {
- dev_err(&pdev->dev, "Failed to enable interface clk\n");
- goto err_clk;
- }
-
/* Find the irq */
ret = platform_get_irq(pdev, 0);
if (ret < 0)
@@ -730,10 +718,6 @@ static int rockchip_sfc_probe(struct platform_device *pdev)
pm_runtime_set_suspended(dev);
pm_runtime_dont_use_autosuspend(dev);
err_irq:
- clk_disable_unprepare(sfc->clk);
-err_clk:
- clk_disable_unprepare(sfc->hclk);
-err_hclk:
return ret;
}
@@ -747,8 +731,6 @@ static void rockchip_sfc_remove(struct platform_device *pdev)
DMA_BIDIRECTIONAL);
free_pages((unsigned long)sfc->buffer, get_order(sfc->max_iosize));
- clk_disable_unprepare(sfc->clk);
- clk_disable_unprepare(sfc->hclk);
}
#ifdef CONFIG_PM
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 09/17] spi: sifive: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (7 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 08/17] spi: rockchip-sfc: " Pei Xiao
@ 2026-03-18 2:39 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 10/17] spi: slave-mt27xx: " Pei Xiao
` (7 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:39 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the bus clock. This reduces boilerplate code
and error handling, as the managed API automatically disables the clock
when the device is removed or if probe fails.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error path and the remove callback. Adjust the error handling to use the
existing put_host label.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-sifive.c | 21 ++++++---------------
1 file changed, 6 insertions(+), 15 deletions(-)
diff --git a/drivers/spi/spi-sifive.c b/drivers/spi/spi-sifive.c
index 6c7aba8befa0..54adbc057af6 100644
--- a/drivers/spi/spi-sifive.c
+++ b/drivers/spi/spi-sifive.c
@@ -312,7 +312,8 @@ static int sifive_spi_probe(struct platform_device *pdev)
goto put_host;
}
- spi->clk = devm_clk_get(&pdev->dev, NULL);
+ /* Spin up the bus clock before hitting registers */
+ spi->clk = devm_clk_get_enabled(&pdev->dev, NULL);
if (IS_ERR(spi->clk)) {
dev_err(&pdev->dev, "Unable to find bus clock\n");
ret = PTR_ERR(spi->clk);
@@ -342,13 +343,6 @@ static int sifive_spi_probe(struct platform_device *pdev)
goto put_host;
}
- /* Spin up the bus clock before hitting registers */
- ret = clk_prepare_enable(spi->clk);
- if (ret) {
- dev_err(&pdev->dev, "Unable to enable bus clock\n");
- goto put_host;
- }
-
/* probe the number of CS lines */
spi->cs_inactive = sifive_spi_read(spi, SIFIVE_SPI_REG_CSDEF);
sifive_spi_write(spi, SIFIVE_SPI_REG_CSDEF, 0xffffffffU);
@@ -357,14 +351,14 @@ static int sifive_spi_probe(struct platform_device *pdev)
if (!cs_bits) {
dev_err(&pdev->dev, "Could not auto probe CS lines\n");
ret = -EINVAL;
- goto disable_clk;
+ goto put_host;
}
num_cs = ilog2(cs_bits) + 1;
if (num_cs > SIFIVE_SPI_MAX_CS) {
dev_err(&pdev->dev, "Invalid number of spi targets\n");
ret = -EINVAL;
- goto disable_clk;
+ goto put_host;
}
/* Define our host */
@@ -392,7 +386,7 @@ static int sifive_spi_probe(struct platform_device *pdev)
dev_name(&pdev->dev), spi);
if (ret) {
dev_err(&pdev->dev, "Unable to bind to interrupt\n");
- goto disable_clk;
+ goto put_host;
}
dev_info(&pdev->dev, "mapped; irq=%d, cs=%d\n",
@@ -401,13 +395,11 @@ static int sifive_spi_probe(struct platform_device *pdev)
ret = devm_spi_register_controller(&pdev->dev, host);
if (ret < 0) {
dev_err(&pdev->dev, "spi_register_host failed\n");
- goto disable_clk;
+ goto put_host;
}
return 0;
-disable_clk:
- clk_disable_unprepare(spi->clk);
put_host:
spi_controller_put(host);
@@ -421,7 +413,6 @@ static void sifive_spi_remove(struct platform_device *pdev)
/* Disable all the interrupts just in case */
sifive_spi_write(spi, SIFIVE_SPI_REG_IE, 0);
- clk_disable_unprepare(spi->clk);
}
static int sifive_spi_suspend(struct device *dev)
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 10/17] spi: slave-mt27xx: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (8 preceding siblings ...)
2026-03-18 2:39 ` [PATCH v4 09/17] spi: sifive: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 11/17] spi: st: " Pei Xiao
` (6 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the "spi" clock. This reduces boilerplate
code and error handling, as the managed API automatically disables the
clock when the device is removed or if probe fails.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-slave-mt27xx.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/drivers/spi/spi-slave-mt27xx.c b/drivers/spi/spi-slave-mt27xx.c
index ce889cb33228..8ec886918165 100644
--- a/drivers/spi/spi-slave-mt27xx.c
+++ b/drivers/spi/spi-slave-mt27xx.c
@@ -438,19 +438,13 @@ static int mtk_spi_slave_probe(struct platform_device *pdev)
goto err_put_ctlr;
}
- mdata->spi_clk = devm_clk_get(&pdev->dev, "spi");
+ mdata->spi_clk = devm_clk_get_enabled(&pdev->dev, "spi");
if (IS_ERR(mdata->spi_clk)) {
ret = PTR_ERR(mdata->spi_clk);
dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret);
goto err_put_ctlr;
}
- ret = clk_prepare_enable(mdata->spi_clk);
- if (ret < 0) {
- dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret);
- goto err_put_ctlr;
- }
-
pm_runtime_enable(&pdev->dev);
ret = devm_spi_register_controller(&pdev->dev, ctlr);
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 11/17] spi: st: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (9 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 10/17] spi: slave-mt27xx: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 12/17] spi: stm32-qspi: " Pei Xiao
` (5 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This removes the need for
explicit clock enable and disable calls, as the managed API automatically
handles clock disabling on device removal or probe failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error path and the remove callback. Adjust error labels accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-st-ssc4.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)
diff --git a/drivers/spi/spi-st-ssc4.c b/drivers/spi/spi-st-ssc4.c
index b173ef70d77e..0d653986499c 100644
--- a/drivers/spi/spi-st-ssc4.c
+++ b/drivers/spi/spi-st-ssc4.c
@@ -293,24 +293,20 @@ static int spi_st_probe(struct platform_device *pdev)
host->use_gpio_descriptors = true;
spi_st = spi_controller_get_devdata(host);
- spi_st->clk = devm_clk_get(&pdev->dev, "ssc");
+ spi_st->clk = devm_clk_get_enabled(&pdev->dev, "ssc");
if (IS_ERR(spi_st->clk)) {
dev_err(&pdev->dev, "Unable to request clock\n");
ret = PTR_ERR(spi_st->clk);
goto put_host;
}
- ret = clk_prepare_enable(spi_st->clk);
- if (ret)
- goto put_host;
-
init_completion(&spi_st->done);
/* Get resources */
spi_st->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(spi_st->base)) {
ret = PTR_ERR(spi_st->base);
- goto clk_disable;
+ goto put_host;
}
/* Disable I2C and Reset SSC */
@@ -333,14 +329,14 @@ static int spi_st_probe(struct platform_device *pdev)
if (!irq) {
dev_err(&pdev->dev, "IRQ missing or invalid\n");
ret = -EINVAL;
- goto clk_disable;
+ goto put_host;
}
ret = devm_request_irq(&pdev->dev, irq, spi_st_irq, 0,
pdev->name, spi_st);
if (ret) {
dev_err(&pdev->dev, "Failed to request irq %d\n", irq);
- goto clk_disable;
+ goto put_host;
}
/* by default the device is on */
@@ -359,8 +355,6 @@ static int spi_st_probe(struct platform_device *pdev)
rpm_disable:
pm_runtime_disable(&pdev->dev);
-clk_disable:
- clk_disable_unprepare(spi_st->clk);
put_host:
spi_controller_put(host);
return ret;
@@ -373,8 +367,6 @@ static void spi_st_remove(struct platform_device *pdev)
pm_runtime_disable(&pdev->dev);
- clk_disable_unprepare(spi_st->clk);
-
pinctrl_pm_select_sleep_state(&pdev->dev);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 12/17] spi: stm32-qspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (10 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 11/17] spi: st: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 13/17] spi: stm32: " Pei Xiao
` (4 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This removes the need for
explicit clock enable and disable calls, as the managed API automatically
handles clock disabling on device removal or probe failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error path and the remove callback. Adjust error labels accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-stm32-qspi.c | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-stm32-qspi.c b/drivers/spi/spi-stm32-qspi.c
index df1bbacec90a..a8436f70fdfd 100644
--- a/drivers/spi/spi-stm32-qspi.c
+++ b/drivers/spi/spi-stm32-qspi.c
@@ -819,25 +819,19 @@ static int stm32_qspi_probe(struct platform_device *pdev)
init_completion(&qspi->match_completion);
- qspi->clk = devm_clk_get(dev, NULL);
+ qspi->clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(qspi->clk))
- return PTR_ERR(qspi->clk);
-
+ return dev_err_probe(dev, PTR_ERR(qspi->clk),
+ "can not enable the clock\n");
qspi->clk_rate = clk_get_rate(qspi->clk);
if (!qspi->clk_rate)
return -EINVAL;
- ret = clk_prepare_enable(qspi->clk);
- if (ret) {
- dev_err(dev, "can not enable the clock\n");
- return ret;
- }
-
rstc = devm_reset_control_get_exclusive(dev, NULL);
if (IS_ERR(rstc)) {
ret = PTR_ERR(rstc);
if (ret == -EPROBE_DEFER)
- goto err_clk_disable;
+ goto err_defer;
} else {
reset_control_assert(rstc);
udelay(2);
@@ -886,8 +880,7 @@ static int stm32_qspi_probe(struct platform_device *pdev)
pm_runtime_dont_use_autosuspend(qspi->dev);
err_dma_free:
stm32_qspi_dma_free(qspi);
-err_clk_disable:
- clk_disable_unprepare(qspi->clk);
+err_defer:
return ret;
}
@@ -906,7 +899,6 @@ static void stm32_qspi_remove(struct platform_device *pdev)
pm_runtime_disable(qspi->dev);
pm_runtime_set_suspended(qspi->dev);
pm_runtime_dont_use_autosuspend(qspi->dev);
- clk_disable_unprepare(qspi->clk);
}
static int stm32_qspi_runtime_suspend(struct device *dev)
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 13/17] spi: stm32: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (11 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 12/17] spi: stm32-qspi: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 17:20 ` [Linux-stm32] " Amelie Delaunay
2026-03-18 2:40 ` [PATCH v4 14/17] spi: sunplus-sp7021: " Pei Xiao
` (3 subsequent siblings)
16 siblings, 1 reply; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This removes the need for
explicit clock enable and disable calls, as the managed API automatically
handles clock disabling on device removal or probe failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error paths and the remove callback. Also simplify error handling by
using dev_err_probe().
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-stm32.c | 61 ++++++++++++-----------------------------
1 file changed, 18 insertions(+), 43 deletions(-)
diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
index 8a7f5a10d4af..ee5092bc5956 100644
--- a/drivers/spi/spi-stm32.c
+++ b/drivers/spi/spi-stm32.c
@@ -2360,25 +2360,21 @@ static int stm32_spi_probe(struct platform_device *pdev)
int ret;
cfg = of_device_get_match_data(&pdev->dev);
- if (!cfg) {
- dev_err(&pdev->dev, "Failed to get match data for platform\n");
- return -ENODEV;
- }
+ if (!cfg)
+ return dev_err_probe(&pdev->dev, -ENODEV,
+ "Failed to get match data for platform\n");
device_mode = of_property_read_bool(np, "spi-slave");
- if (!cfg->has_device_mode && device_mode) {
- dev_err(&pdev->dev, "spi-slave not supported\n");
- return -EPERM;
- }
+ if (!cfg->has_device_mode && device_mode)
+ return dev_err_probe(&pdev->dev, -EPERM, "spi-slave not supported\n");
if (device_mode)
ctrl = devm_spi_alloc_target(&pdev->dev, sizeof(struct stm32_spi));
else
ctrl = devm_spi_alloc_host(&pdev->dev, sizeof(struct stm32_spi));
- if (!ctrl) {
- dev_err(&pdev->dev, "spi controller allocation failed\n");
- return -ENOMEM;
- }
+ if (!ctrl)
+ return dev_err_probe(&pdev->dev, -ENOMEM,
+ "spi controller allocation failed\n");
platform_set_drvdata(pdev, ctrl);
spi = spi_controller_get_devdata(ctrl);
@@ -2409,32 +2405,19 @@ static int stm32_spi_probe(struct platform_device *pdev)
return ret;
}
- spi->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(spi->clk)) {
- ret = PTR_ERR(spi->clk);
- dev_err(&pdev->dev, "clk get failed: %d\n", ret);
- return ret;
- }
+ spi->clk = devm_clk_get_enabled(&pdev->dev, NULL);
+ if (IS_ERR(spi->clk))
+ return dev_err_probe(&pdev->dev, PTR_ERR(spi->clk), "clk enabled failed\n");
- ret = clk_prepare_enable(spi->clk);
- if (ret) {
- dev_err(&pdev->dev, "clk enable failed: %d\n", ret);
- return ret;
- }
spi->clk_rate = clk_get_rate(spi->clk);
- if (!spi->clk_rate) {
- dev_err(&pdev->dev, "clk rate = 0\n");
- ret = -EINVAL;
- goto err_clk_disable;
- }
+ if (!spi->clk_rate)
+ return dev_err_probe(&pdev->dev, -EINVAL, "clk rate = 0\n");
rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
if (rst) {
- if (IS_ERR(rst)) {
+ if (IS_ERR(rst))
ret = dev_err_probe(&pdev->dev, PTR_ERR(rst),
"failed to get reset\n");
- goto err_clk_disable;
- }
reset_control_assert(rst);
udelay(2);
@@ -2461,11 +2444,9 @@ static int stm32_spi_probe(struct platform_device *pdev)
dev_dbg(spi->dev, "one message max size %d\n", spi->t_size_max);
ret = spi->cfg->config(spi);
- if (ret) {
- dev_err(&pdev->dev, "controller configuration failed: %d\n",
- ret);
- goto err_clk_disable;
- }
+ if (ret)
+ return dev_err_probe(&pdev->dev, ret,
+ "controller configuration failed: %d\n", ret);
ctrl->auto_runtime_pm = true;
ctrl->bus_num = pdev->id;
@@ -2490,8 +2471,7 @@ static int stm32_spi_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "tx dma disabled\n");
spi->dma_tx = NULL;
} else {
- dev_err_probe(&pdev->dev, ret, "failed to request tx dma channel\n");
- goto err_clk_disable;
+ return dev_err_probe(&pdev->dev, ret, "failed to request tx dma channel\n");
}
} else {
ctrl->dma_tx = spi->dma_tx;
@@ -2579,8 +2559,6 @@ static int stm32_spi_probe(struct platform_device *pdev)
err_dma_tx_release:
if (spi->dma_tx)
dma_release_channel(spi->dma_tx);
-err_clk_disable:
- clk_disable_unprepare(spi->clk);
return ret;
}
@@ -2610,9 +2588,6 @@ static void stm32_spi_remove(struct platform_device *pdev)
gen_pool_free(spi->sram_pool, (unsigned long)spi->sram_rx_buf,
spi->sram_rx_buf_size);
- clk_disable_unprepare(spi->clk);
-
-
pinctrl_pm_select_sleep_state(&pdev->dev);
}
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 14/17] spi: sunplus-sp7021: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (12 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 13/17] spi: stm32: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 15/17] spi: uniphier: " Pei Xiao
` (2 subsequent siblings)
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This removes the need for
explicit clock enable/disable calls and the custom cleanup function,
as the managed API automatically handles clock disabling on device
removal or probe failure.
Remove the now-unnecessary sp7021_spi_disable_unprepare() function
and the devm_add_action_or_reset() call.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-sunplus-sp7021.c | 15 +--------------
1 file changed, 1 insertion(+), 14 deletions(-)
diff --git a/drivers/spi/spi-sunplus-sp7021.c b/drivers/spi/spi-sunplus-sp7021.c
index 789b092fe8c0..35601212fb78 100644
--- a/drivers/spi/spi-sunplus-sp7021.c
+++ b/drivers/spi/spi-sunplus-sp7021.c
@@ -389,11 +389,6 @@ static int sp7021_spi_target_transfer_one(struct spi_controller *ctlr, struct sp
return ret;
}
-static void sp7021_spi_disable_unprepare(void *data)
-{
- clk_disable_unprepare(data);
-}
-
static void sp7021_spi_reset_control_assert(void *data)
{
reset_control_assert(data);
@@ -460,7 +455,7 @@ static int sp7021_spi_controller_probe(struct platform_device *pdev)
if (pspim->s_irq < 0)
return pspim->s_irq;
- pspim->spi_clk = devm_clk_get(dev, NULL);
+ pspim->spi_clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(pspim->spi_clk))
return dev_err_probe(dev, PTR_ERR(pspim->spi_clk), "clk get fail\n");
@@ -468,14 +463,6 @@ static int sp7021_spi_controller_probe(struct platform_device *pdev)
if (IS_ERR(pspim->rstc))
return dev_err_probe(dev, PTR_ERR(pspim->rstc), "rst get fail\n");
- ret = clk_prepare_enable(pspim->spi_clk);
- if (ret)
- return dev_err_probe(dev, ret, "failed to enable clk\n");
-
- ret = devm_add_action_or_reset(dev, sp7021_spi_disable_unprepare, pspim->spi_clk);
- if (ret)
- return ret;
-
ret = reset_control_deassert(pspim->rstc);
if (ret)
return dev_err_probe(dev, ret, "failed to deassert reset\n");
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 15/17] spi: uniphier: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (13 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 14/17] spi: sunplus-sp7021: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 16/17] spi: zynq-qspi: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 17/17] spi: zynqmp-gqspi: " Pei Xiao
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for the clock. This removes the need for
explicit clock enable and disable calls, as the managed API automatically
handles clock disabling on device removal or probe failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the probe
error path and the remove callback. Adjust error labels accordingly.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-uniphier.c | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-uniphier.c b/drivers/spi/spi-uniphier.c
index 9e1d364a6198..f975d0431e6f 100644
--- a/drivers/spi/spi-uniphier.c
+++ b/drivers/spi/spi-uniphier.c
@@ -666,28 +666,24 @@ static int uniphier_spi_probe(struct platform_device *pdev)
}
priv->base_dma_addr = res->start;
- priv->clk = devm_clk_get(&pdev->dev, NULL);
+ priv->clk = devm_clk_get_enabled(&pdev->dev, NULL);
if (IS_ERR(priv->clk)) {
dev_err(&pdev->dev, "failed to get clock\n");
ret = PTR_ERR(priv->clk);
goto out_host_put;
}
- ret = clk_prepare_enable(priv->clk);
- if (ret)
- goto out_host_put;
-
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
ret = irq;
- goto out_disable_clk;
+ goto out_host_put;
}
ret = devm_request_irq(&pdev->dev, irq, uniphier_spi_handler,
0, "uniphier-spi", priv);
if (ret) {
dev_err(&pdev->dev, "failed to request IRQ\n");
- goto out_disable_clk;
+ goto out_host_put;
}
init_completion(&priv->xfer_done);
@@ -716,7 +712,7 @@ static int uniphier_spi_probe(struct platform_device *pdev)
if (IS_ERR_OR_NULL(host->dma_tx)) {
if (PTR_ERR(host->dma_tx) == -EPROBE_DEFER) {
ret = -EPROBE_DEFER;
- goto out_disable_clk;
+ goto out_host_put;
}
host->dma_tx = NULL;
dma_tx_burst = INT_MAX;
@@ -766,9 +762,6 @@ static int uniphier_spi_probe(struct platform_device *pdev)
host->dma_tx = NULL;
}
-out_disable_clk:
- clk_disable_unprepare(priv->clk);
-
out_host_put:
spi_controller_put(host);
return ret;
@@ -783,8 +776,6 @@ static void uniphier_spi_remove(struct platform_device *pdev)
dma_release_channel(host->dma_tx);
if (host->dma_rx)
dma_release_channel(host->dma_rx);
-
- clk_disable_unprepare(priv->clk);
}
static const struct of_device_id uniphier_spi_match[] = {
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 16/17] spi: zynq-qspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (14 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 15/17] spi: uniphier: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
2026-03-18 2:40 ` [PATCH v4 17/17] spi: zynqmp-gqspi: " Pei Xiao
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both "pclk" and "ref_clk". This removes
the need for explicit clock enable and disable calls, as the managed
API automatically disables the clocks on device removal or probe
failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback. Simplify error handling
by jumping directly to the remove_ctlr label.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-zynq-qspi.c | 31 ++++++-------------------------
1 file changed, 6 insertions(+), 25 deletions(-)
diff --git a/drivers/spi/spi-zynq-qspi.c b/drivers/spi/spi-zynq-qspi.c
index 5232483c4a3a..8c3975030d0a 100644
--- a/drivers/spi/spi-zynq-qspi.c
+++ b/drivers/spi/spi-zynq-qspi.c
@@ -661,7 +661,7 @@ static int zynq_qspi_probe(struct platform_device *pdev)
goto remove_ctlr;
}
- xqspi->pclk = devm_clk_get(&pdev->dev, "pclk");
+ xqspi->pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
if (IS_ERR(xqspi->pclk)) {
dev_err(&pdev->dev, "pclk clock not found.\n");
ret = PTR_ERR(xqspi->pclk);
@@ -670,36 +670,24 @@ static int zynq_qspi_probe(struct platform_device *pdev)
init_completion(&xqspi->data_completion);
- xqspi->refclk = devm_clk_get(&pdev->dev, "ref_clk");
+ xqspi->refclk = devm_clk_get_enabled(&pdev->dev, "ref_clk");
if (IS_ERR(xqspi->refclk)) {
dev_err(&pdev->dev, "ref_clk clock not found.\n");
ret = PTR_ERR(xqspi->refclk);
goto remove_ctlr;
}
- ret = clk_prepare_enable(xqspi->pclk);
- if (ret) {
- dev_err(&pdev->dev, "Unable to enable APB clock.\n");
- goto remove_ctlr;
- }
-
- ret = clk_prepare_enable(xqspi->refclk);
- if (ret) {
- dev_err(&pdev->dev, "Unable to enable device clock.\n");
- goto clk_dis_pclk;
- }
-
xqspi->irq = platform_get_irq(pdev, 0);
if (xqspi->irq < 0) {
ret = xqspi->irq;
- goto clk_dis_all;
+ goto remove_ctlr;
}
ret = devm_request_irq(&pdev->dev, xqspi->irq, zynq_qspi_irq,
0, pdev->name, xqspi);
if (ret != 0) {
ret = -ENXIO;
dev_err(&pdev->dev, "request_irq failed\n");
- goto clk_dis_all;
+ goto remove_ctlr;
}
ret = of_property_read_u32(np, "num-cs",
@@ -709,7 +697,7 @@ static int zynq_qspi_probe(struct platform_device *pdev)
} else if (num_cs > ZYNQ_QSPI_MAX_NUM_CS) {
ret = -EINVAL;
dev_err(&pdev->dev, "only 2 chip selects are available\n");
- goto clk_dis_all;
+ goto remove_ctlr;
} else {
ctlr->num_chipselect = num_cs;
}
@@ -728,15 +716,11 @@ static int zynq_qspi_probe(struct platform_device *pdev)
ret = devm_spi_register_controller(&pdev->dev, ctlr);
if (ret) {
dev_err(&pdev->dev, "devm_spi_register_controller failed\n");
- goto clk_dis_all;
+ goto remove_ctlr;
}
return ret;
-clk_dis_all:
- clk_disable_unprepare(xqspi->refclk);
-clk_dis_pclk:
- clk_disable_unprepare(xqspi->pclk);
remove_ctlr:
spi_controller_put(ctlr);
@@ -758,9 +742,6 @@ static void zynq_qspi_remove(struct platform_device *pdev)
struct zynq_qspi *xqspi = platform_get_drvdata(pdev);
zynq_qspi_write(xqspi, ZYNQ_QSPI_ENABLE_OFFSET, 0);
-
- clk_disable_unprepare(xqspi->refclk);
- clk_disable_unprepare(xqspi->pclk);
}
static const struct of_device_id zynq_qspi_of_match[] = {
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v4 17/17] spi: zynqmp-gqspi: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
` (15 preceding siblings ...)
2026-03-18 2:40 ` [PATCH v4 16/17] spi: zynq-qspi: " Pei Xiao
@ 2026-03-18 2:40 ` Pei Xiao
16 siblings, 0 replies; 20+ messages in thread
From: Pei Xiao @ 2026-03-18 2:40 UTC (permalink / raw)
To: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Cc: Pei Xiao
Replace devm_clk_get() followed by clk_prepare_enable() with
devm_clk_get_enabled() for both "pclk" and "ref_clk". This removes
the need for explicit clock enable and disable calls, as the managed
API automatically disables the clocks on device removal or probe
failure.
Remove the now-unnecessary clk_disable_unprepare() calls from the
probe error paths and the remove callback.
Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
---
drivers/spi/spi-zynqmp-gqspi.c | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/drivers/spi/spi-zynqmp-gqspi.c b/drivers/spi/spi-zynqmp-gqspi.c
index 502fd5eccc83..a7e135607e2a 100644
--- a/drivers/spi/spi-zynqmp-gqspi.c
+++ b/drivers/spi/spi-zynqmp-gqspi.c
@@ -1244,26 +1244,16 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)
if (IS_ERR(xqspi->regs))
return PTR_ERR(xqspi->regs);
- xqspi->pclk = devm_clk_get(&pdev->dev, "pclk");
+ xqspi->pclk = devm_clk_get_enabled(&pdev->dev, "pclk");
if (IS_ERR(xqspi->pclk))
return dev_err_probe(dev, PTR_ERR(xqspi->pclk),
"pclk clock not found.\n");
- xqspi->refclk = devm_clk_get(&pdev->dev, "ref_clk");
+ xqspi->refclk = devm_clk_get_enabled(&pdev->dev, "ref_clk");
if (IS_ERR(xqspi->refclk))
return dev_err_probe(dev, PTR_ERR(xqspi->refclk),
"ref_clk clock not found.\n");
- ret = clk_prepare_enable(xqspi->pclk);
- if (ret)
- return dev_err_probe(dev, ret, "Unable to enable APB clock.\n");
-
- ret = clk_prepare_enable(xqspi->refclk);
- if (ret) {
- dev_err(dev, "Unable to enable device clock.\n");
- goto clk_dis_pclk;
- }
-
init_completion(&xqspi->data_completion);
mutex_init(&xqspi->op_lock);
@@ -1339,9 +1329,6 @@ static int zynqmp_qspi_probe(struct platform_device *pdev)
pm_runtime_dont_use_autosuspend(&pdev->dev);
pm_runtime_put_noidle(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
- clk_disable_unprepare(xqspi->refclk);
-clk_dis_pclk:
- clk_disable_unprepare(xqspi->pclk);
return ret;
}
@@ -1368,8 +1355,6 @@ static void zynqmp_qspi_remove(struct platform_device *pdev)
pm_runtime_dont_use_autosuspend(&pdev->dev);
pm_runtime_put_noidle(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
- clk_disable_unprepare(xqspi->refclk);
- clk_disable_unprepare(xqspi->pclk);
}
MODULE_DEVICE_TABLE(of, zynqmp_qspi_of_match);
--
2.25.1
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v4 05/17] spi: imx: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:39 ` [PATCH v4 05/17] spi: imx: " Pei Xiao
@ 2026-03-18 13:45 ` Frank Li
0 siblings, 0 replies; 20+ messages in thread
From: Frank Li @ 2026-03-18 13:45 UTC (permalink / raw)
To: Pei Xiao
Cc: linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
On Wed, Mar 18, 2026 at 10:39:55AM +0800, Pei Xiao wrote:
> Replace devm_clk_get() followed by clk_prepare_enable() with
> devm_clk_get_enabled() for both "ipg" and "per" clocks. This reduces
> boilerplate code and error handling, as the managed API automatically
> disables the clocks when the device is removed or if probe fails.
>
> Remove the now-unnecessary clk_disable_unprepare() calls from the
> probe error paths.
>
> Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> drivers/spi/spi-imx.c | 15 ++-------------
> 1 file changed, 2 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
> index 64c6c09e1e7b..a01c466818de 100644
> --- a/drivers/spi/spi-imx.c
> +++ b/drivers/spi/spi-imx.c
> @@ -2323,26 +2323,18 @@ static int spi_imx_probe(struct platform_device *pdev)
> goto out_controller_put;
> }
>
> - spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
> + spi_imx->clk_ipg = devm_clk_get_enabled(&pdev->dev, "ipg");
> if (IS_ERR(spi_imx->clk_ipg)) {
> ret = PTR_ERR(spi_imx->clk_ipg);
> goto out_controller_put;
> }
>
> - spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
> + spi_imx->clk_per = devm_clk_get_enabled(&pdev->dev, "per");
> if (IS_ERR(spi_imx->clk_per)) {
> ret = PTR_ERR(spi_imx->clk_per);
> goto out_controller_put;
> }
>
> - ret = clk_prepare_enable(spi_imx->clk_per);
> - if (ret)
> - goto out_controller_put;
> -
> - ret = clk_prepare_enable(spi_imx->clk_ipg);
> - if (ret)
> - goto out_put_per;
> -
> pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
> pm_runtime_use_autosuspend(spi_imx->dev);
> pm_runtime_get_noresume(spi_imx->dev);
> @@ -2386,9 +2378,6 @@ static int spi_imx_probe(struct platform_device *pdev)
> pm_runtime_disable(spi_imx->dev);
> pm_runtime_set_suspended(&pdev->dev);
>
> - clk_disable_unprepare(spi_imx->clk_ipg);
> -out_put_per:
> - clk_disable_unprepare(spi_imx->clk_per);
> out_controller_put:
> spi_controller_put(controller);
>
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Linux-stm32] [PATCH v4 13/17] spi: stm32: Simplify clock handling with devm_clk_get_enabled()
2026-03-18 2:40 ` [PATCH v4 13/17] spi: stm32: " Pei Xiao
@ 2026-03-18 17:20 ` Amelie Delaunay
0 siblings, 0 replies; 20+ messages in thread
From: Amelie Delaunay @ 2026-03-18 17:20 UTC (permalink / raw)
To: Pei Xiao, linux-spi, linux-arm-kernel, linux-kernel, imx, openbmc,
linux-rockchip, linux-riscv, linux-mediatek, linux-stm32
Hi,
On 3/18/26 03:40, Pei Xiao wrote:
> Replace devm_clk_get() followed by clk_prepare_enable() with
> devm_clk_get_enabled() for the clock. This removes the need for
> explicit clock enable and disable calls, as the managed API automatically
> handles clock disabling on device removal or probe failure.
>
> Remove the now-unnecessary clk_disable_unprepare() calls from the probe
> error paths and the remove callback. Also simplify error handling by
> using dev_err_probe().
>
> Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn>
> ---
> drivers/spi/spi-stm32.c | 61 ++++++++++++-----------------------------
> 1 file changed, 18 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
> index 8a7f5a10d4af..ee5092bc5956 100644
> --- a/drivers/spi/spi-stm32.c
> +++ b/drivers/spi/spi-stm32.c
> @@ -2360,25 +2360,21 @@ static int stm32_spi_probe(struct platform_device *pdev)
> int ret;
>
> cfg = of_device_get_match_data(&pdev->dev);
> - if (!cfg) {
> - dev_err(&pdev->dev, "Failed to get match data for platform\n");
> - return -ENODEV;
> - }
> + if (!cfg)
> + return dev_err_probe(&pdev->dev, -ENODEV,
> + "Failed to get match data for platform\n");
>
> device_mode = of_property_read_bool(np, "spi-slave");
> - if (!cfg->has_device_mode && device_mode) {
> - dev_err(&pdev->dev, "spi-slave not supported\n");
> - return -EPERM;
> - }
> + if (!cfg->has_device_mode && device_mode)
> + return dev_err_probe(&pdev->dev, -EPERM, "spi-slave not supported\n");
>
> if (device_mode)
> ctrl = devm_spi_alloc_target(&pdev->dev, sizeof(struct stm32_spi));
> else
> ctrl = devm_spi_alloc_host(&pdev->dev, sizeof(struct stm32_spi));
> - if (!ctrl) {
> - dev_err(&pdev->dev, "spi controller allocation failed\n");
> - return -ENOMEM;
> - }
> + if (!ctrl)
> + return dev_err_probe(&pdev->dev, -ENOMEM,
> + "spi controller allocation failed\n");
it fits on single line
+ return dev_err_probe(&pdev->dev, -ENOMEM, "spi controller allocation
failed\n");
> platform_set_drvdata(pdev, ctrl);
>
> spi = spi_controller_get_devdata(ctrl);
> @@ -2409,32 +2405,19 @@ static int stm32_spi_probe(struct platform_device *pdev)
> return ret;
> }
>
> - spi->clk = devm_clk_get(&pdev->dev, NULL);
> - if (IS_ERR(spi->clk)) {
> - ret = PTR_ERR(spi->clk);
> - dev_err(&pdev->dev, "clk get failed: %d\n", ret);
> - return ret;
> - }
> + spi->clk = devm_clk_get_enabled(&pdev->dev, NULL);
> + if (IS_ERR(spi->clk))
> + return dev_err_probe(&pdev->dev, PTR_ERR(spi->clk), "clk enabled failed\n");
>
> - ret = clk_prepare_enable(spi->clk);
> - if (ret) {
> - dev_err(&pdev->dev, "clk enable failed: %d\n", ret);
> - return ret;
> - }
> spi->clk_rate = clk_get_rate(spi->clk);
> - if (!spi->clk_rate) {
> - dev_err(&pdev->dev, "clk rate = 0\n");
> - ret = -EINVAL;
> - goto err_clk_disable;
> - }
> + if (!spi->clk_rate)
> + return dev_err_probe(&pdev->dev, -EINVAL, "clk rate = 0\n");
>
> rst = devm_reset_control_get_optional_exclusive(&pdev->dev, NULL);
> if (rst) {
> - if (IS_ERR(rst)) {
> + if (IS_ERR(rst))
> ret = dev_err_probe(&pdev->dev, PTR_ERR(rst),
> "failed to get reset\n");
> - goto err_clk_disable;
> - }
Here you change the behavior: it should return dev_err_probe(...) (on
single line too)
+ if (IS_ERR(rst))
+ return dev_err_probe(&pdev->dev, PTR_ERR(rst), "failed to get
reset\n");
>
> reset_control_assert(rst);
> udelay(2);
> @@ -2461,11 +2444,9 @@ static int stm32_spi_probe(struct platform_device *pdev)
> dev_dbg(spi->dev, "one message max size %d\n", spi->t_size_max);
>
> ret = spi->cfg->config(spi);
> - if (ret) {
> - dev_err(&pdev->dev, "controller configuration failed: %d\n",
> - ret);
> - goto err_clk_disable;
> - }
> + if (ret)
> + return dev_err_probe(&pdev->dev, ret,
> + "controller configuration failed: %d\n", ret);
it fits on single line too here.
>
> ctrl->auto_runtime_pm = true;
> ctrl->bus_num = pdev->id;
> @@ -2490,8 +2471,7 @@ static int stm32_spi_probe(struct platform_device *pdev)
> dev_info(&pdev->dev, "tx dma disabled\n");
> spi->dma_tx = NULL;
> } else {
> - dev_err_probe(&pdev->dev, ret, "failed to request tx dma channel\n");
> - goto err_clk_disable;
> + return dev_err_probe(&pdev->dev, ret, "failed to request tx dma channel\n");
> }
> } else {
> ctrl->dma_tx = spi->dma_tx;
> @@ -2579,8 +2559,6 @@ static int stm32_spi_probe(struct platform_device *pdev)
> err_dma_tx_release:
> if (spi->dma_tx)
> dma_release_channel(spi->dma_tx);
> -err_clk_disable:
> - clk_disable_unprepare(spi->clk);
>
> return ret;
> }
> @@ -2610,9 +2588,6 @@ static void stm32_spi_remove(struct platform_device *pdev)
> gen_pool_free(spi->sram_pool, (unsigned long)spi->sram_rx_buf,
> spi->sram_rx_buf_size);
>
> - clk_disable_unprepare(spi->clk);
> -
> -
> pinctrl_pm_select_sleep_state(&pdev->dev);
> }
>
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2026-03-18 17:20 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-18 2:39 [PATCH v4 00/17] cleanup in spi by use devm_clk_get_enabled Pei Xiao
2026-03-18 2:39 ` [PATCH v4 01/17] spi: axiado: Simplify clock management with devm_clk_get_enabled() Pei Xiao
2026-03-18 2:39 ` [PATCH v4 02/17] spi: bcm63xx-hsspi: Simplify clock handling " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 03/17] spi: bcmbca-hsspi: " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 04/17] spi: img-spfi: " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 05/17] spi: imx: " Pei Xiao
2026-03-18 13:45 ` Frank Li
2026-03-18 2:39 ` [PATCH v4 06/17] spi: npcm-pspi: " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 07/17] spi: orion: " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 08/17] spi: rockchip-sfc: " Pei Xiao
2026-03-18 2:39 ` [PATCH v4 09/17] spi: sifive: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 10/17] spi: slave-mt27xx: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 11/17] spi: st: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 12/17] spi: stm32-qspi: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 13/17] spi: stm32: " Pei Xiao
2026-03-18 17:20 ` [Linux-stm32] " Amelie Delaunay
2026-03-18 2:40 ` [PATCH v4 14/17] spi: sunplus-sp7021: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 15/17] spi: uniphier: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 16/17] spi: zynq-qspi: " Pei Xiao
2026-03-18 2:40 ` [PATCH v4 17/17] spi: zynqmp-gqspi: " Pei Xiao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox