Message ID | 20250411-b4-upstream_ospi_reset_update-v2-2-4de7f5dd2a91@foss.st.com |
---|---|
State | New |
Headers | show |
Series | reset: Add devm_reset_control_array_get_exclusive_released() | expand |
Hi Patrice, On Fr, 2025-04-11 at 14:41 +0200, Patrice Chotard wrote: > 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. > > Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com> > --- > drivers/spi/spi-stm32-ospi.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c > index d002b9c16714684e4e4623f9255a7f2660c46fd1..ef840f377459891b559be6d6c0435408fb58a1e9 100644 > --- a/drivers/spi/spi-stm32-ospi.c > +++ b/drivers/spi/spi-stm32-ospi.c > @@ -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,14 @@ 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); > + reset_control_release(ospi->rstc); Could you keep the reset control (mostly) acquired from probe() to remove()? The reset control would have to be released/acquired in OSPI suspend/resume so that OMM can temporarily acquire control during OMM resume. regards Philipp
On 5/5/25 15:12, Philipp Zabel wrote: > Hi Patrice, > > On Fr, 2025-04-11 at 14:41 +0200, Patrice Chotard wrote: >> 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. >> >> Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com> >> --- >> drivers/spi/spi-stm32-ospi.c | 15 +++++++++------ >> 1 file changed, 9 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c >> index d002b9c16714684e4e4623f9255a7f2660c46fd1..ef840f377459891b559be6d6c0435408fb58a1e9 100644 >> --- a/drivers/spi/spi-stm32-ospi.c >> +++ b/drivers/spi/spi-stm32-ospi.c >> @@ -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,14 @@ 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); >> + reset_control_release(ospi->rstc); > > Could you keep the reset control (mostly) acquired from probe() to > remove()? The reset control would have to be released/acquired in OSPI > suspend/resume so that OMM can temporarily acquire control during OMM > resume. Ok Thanks Patrice > > regards > Philipp
diff --git a/drivers/spi/spi-stm32-ospi.c b/drivers/spi/spi-stm32-ospi.c index d002b9c16714684e4e4623f9255a7f2660c46fd1..ef840f377459891b559be6d6c0435408fb58a1e9 100644 --- a/drivers/spi/spi-stm32-ospi.c +++ b/drivers/spi/spi-stm32-ospi.c @@ -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,14 @@ 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); + reset_control_release(ospi->rstc); ret = spi_register_controller(ctrl); if (ret) {
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. Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com> --- drivers/spi/spi-stm32-ospi.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)