mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
spi: stm32-ospi: Make usage of reset_control_acquire/release() API
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: 79b8a705e2
("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>
This commit is contained in:
parent
e51a086117
commit
cf2c3eceb7
1 changed files with 18 additions and 6 deletions
|
@ -804,7 +804,7 @@ static int stm32_ospi_get_resources(struct platform_device *pdev)
|
||||||
return ret;
|
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))
|
if (IS_ERR(ospi->rstc))
|
||||||
return dev_err_probe(dev, PTR_ERR(ospi->rstc),
|
return dev_err_probe(dev, PTR_ERR(ospi->rstc),
|
||||||
"Can't get reset\n");
|
"Can't get reset\n");
|
||||||
|
@ -936,11 +936,13 @@ static int stm32_ospi_probe(struct platform_device *pdev)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_pm_enable;
|
goto err_pm_enable;
|
||||||
|
|
||||||
if (ospi->rstc) {
|
ret = reset_control_acquire(ospi->rstc);
|
||||||
reset_control_assert(ospi->rstc);
|
if (ret)
|
||||||
udelay(2);
|
return dev_err_probe(dev, ret, "Can not acquire reset %d\n", ret);
|
||||||
reset_control_deassert(ospi->rstc);
|
|
||||||
}
|
reset_control_assert(ospi->rstc);
|
||||||
|
udelay(2);
|
||||||
|
reset_control_deassert(ospi->rstc);
|
||||||
|
|
||||||
ret = spi_register_controller(ctrl);
|
ret = spi_register_controller(ctrl);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -987,6 +989,8 @@ static void stm32_ospi_remove(struct platform_device *pdev)
|
||||||
if (ospi->dma_chrx)
|
if (ospi->dma_chrx)
|
||||||
dma_release_channel(ospi->dma_chrx);
|
dma_release_channel(ospi->dma_chrx);
|
||||||
|
|
||||||
|
reset_control_release(ospi->rstc);
|
||||||
|
|
||||||
pm_runtime_put_sync_suspend(ospi->dev);
|
pm_runtime_put_sync_suspend(ospi->dev);
|
||||||
pm_runtime_force_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);
|
pinctrl_pm_select_sleep_state(dev);
|
||||||
|
|
||||||
|
reset_control_release(ospi->rstc);
|
||||||
|
|
||||||
return pm_runtime_force_suspend(ospi->dev);
|
return pm_runtime_force_suspend(ospi->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,6 +1022,12 @@ static int __maybe_unused stm32_ospi_resume(struct device *dev)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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->cr_reg, regs_base + OSPI_CR);
|
||||||
writel_relaxed(ospi->dcr_reg, regs_base + OSPI_DCR1);
|
writel_relaxed(ospi->dcr_reg, regs_base + OSPI_DCR1);
|
||||||
pm_runtime_mark_last_busy(ospi->dev);
|
pm_runtime_mark_last_busy(ospi->dev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue