spi: stm32-ospi: Make usage of reset_control_acquire/release() API
authorPatrice Chotard <patrice.chotard@foss.st.com>
Mon, 9 Jun 2025 15:05:04 +0000 (17:05 +0200)
committerMark Brown <broonie@kernel.org>
Mon, 9 Jun 2025 15:21:29 +0000 (16:21 +0100)
As ospi reset is consumed by both OMM and OSPI drivers, use the reset
acquire/release mechanism which ensure exclusive reset usage.

This avoid to call reset_control_get/put() in OMM driver each time
we need to reset OSPI children and guarantee the reset line stays
deasserted.

During resume, OMM driver takes temporarily control of reset.

Fixes: 79b8a705e26c ("spi: stm32: Add OSPI driver")
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Link: https://patch.msgid.link/20250609-b4-upstream_ospi_reset_update-v6-1-5b602b567e8a@foss.st.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-stm32-ospi.c

index 7c1fa55fbc4726d2f3c5516245ccd81f59c3c44d..db6b1cfc970f6c80515a39073e2389311796da8f 100644 (file)
@@ -804,7 +804,7 @@ static int stm32_ospi_get_resources(struct platform_device *pdev)
                return ret;
        }
 
-       ospi->rstc = devm_reset_control_array_get_exclusive(dev);
+       ospi->rstc = devm_reset_control_array_get_exclusive_released(dev);
        if (IS_ERR(ospi->rstc))
                return dev_err_probe(dev, PTR_ERR(ospi->rstc),
                                     "Can't get reset\n");
@@ -936,11 +936,13 @@ static int stm32_ospi_probe(struct platform_device *pdev)
        if (ret < 0)
                goto err_pm_enable;
 
-       if (ospi->rstc) {
-               reset_control_assert(ospi->rstc);
-               udelay(2);
-               reset_control_deassert(ospi->rstc);
-       }
+       ret = reset_control_acquire(ospi->rstc);
+       if (ret)
+               return dev_err_probe(dev, ret, "Can not acquire reset %d\n", ret);
+
+       reset_control_assert(ospi->rstc);
+       udelay(2);
+       reset_control_deassert(ospi->rstc);
 
        ret = spi_register_controller(ctrl);
        if (ret) {
@@ -987,6 +989,8 @@ static void stm32_ospi_remove(struct platform_device *pdev)
        if (ospi->dma_chrx)
                dma_release_channel(ospi->dma_chrx);
 
+       reset_control_release(ospi->rstc);
+
        pm_runtime_put_sync_suspend(ospi->dev);
        pm_runtime_force_suspend(ospi->dev);
 }
@@ -997,6 +1001,8 @@ static int __maybe_unused stm32_ospi_suspend(struct device *dev)
 
        pinctrl_pm_select_sleep_state(dev);
 
+       reset_control_release(ospi->rstc);
+
        return pm_runtime_force_suspend(ospi->dev);
 }
 
@@ -1016,6 +1022,12 @@ static int __maybe_unused stm32_ospi_resume(struct device *dev)
        if (ret < 0)
                return ret;
 
+       ret = reset_control_acquire(ospi->rstc);
+       if (ret) {
+               dev_err(dev, "Can not acquire reset\n");
+               return ret;
+       }
+
        writel_relaxed(ospi->cr_reg, regs_base + OSPI_CR);
        writel_relaxed(ospi->dcr_reg, regs_base + OSPI_DCR1);
        pm_runtime_mark_last_busy(ospi->dev);