From: Gabriel FERNANDEZ <gabriel.fernandez@foss.st.com>
To: Philipp Zabel <p.zabel@pengutronix.de>,
Stephen Boyd <sboyd@kernel.org>,
Brian Masney <bmasney+clk@redhat.com>,
Jerome Brunet <jbrunet+clk@baylibre.com>,
Maxime Coquelin <mcoquelin.stm32@gmail.com>,
Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: <linux-clk@vger.kernel.org>,
<linux-stm32@st-md-mailman.stormreply.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] clk: stm32: add support for reset_control_reset()
Date: Wed, 14 Oct 2026 11:38:59 +0200 [thread overview]
Message-ID: <4be10243-3937-4412-a8e2-92ea9fa098ff@foss.st.com> (raw)
In-Reply-To: <f6ebd774c7e65410c70074c94eab966418d7ac9a.camel@pengutronix.de>
Hi Philipp,
Thanks for the review.
On 10/13/26 17:38, Philipp Zabel wrote:
> On Di, 2026-10-13 at 16:52 +0200, Gabriel Fernandez wrote:
>> The STM32 RCC reset controller currently implements only .assert(),
>> .deassert(), and .status().
>> As a result, reset_control_reset() returns -ENOTSUPP, forcing consumers
>> to open-code the assert / delay / deassert sequence.
> Do you have specific consumer drivers in mind?
Yes. stm32-dma3 calls reset_control_reset() at probe time and the
STM32MP25 hantro glue (stm32mp25_venc_reset()) does as well. Today both
get -ENOTSUPP from the RCC, so the reset is silently skipped.
>
>> Implement .reset() to provide the standard reset operation and avoid
>> duplicating this logic in consumers.
> The (documented) purpose of the .reset callback is to allow handling
> self-deasserting resets, not convenience. I try pushing back on
> unnecessary .reset implementations in reset controller drivers.
>
> There are a few drivers with direct level control that implement .reset
> like this, but those are mostly for the benefit of consumer drivers
> that can be paired with different reset controllers, some of which are
> self-deasserting.
OK, I see. We do have some IPs, such as the GPU, that use a self-deasserting
reset. The corresponding driver has not been upstreamed yet.
>> Signed-off-by: Gabriel Fernandez <gabriel.fernandez@foss.st.com>
>> ---
>> drivers/clk/stm32/reset-stm32.c | 45 +++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 45 insertions(+)
>>
>> diff --git a/drivers/clk/stm32/reset-stm32.c b/drivers/clk/stm32/reset-stm32.c
>> index fc237fccae68..9b853417e9c5 100644
>> --- a/drivers/clk/stm32/reset-stm32.c
>> +++ b/drivers/clk/stm32/reset-stm32.c
>> @@ -4,6 +4,8 @@
>> * Author: Gabriel Fernandez <gabriel.fernandez@foss.st.com> for STMicroelectronics.
>> */
>>
>> +#include <linux/delay.h>
>> +#include <linux/iopoll.h>
>> #include <linux/of.h>
>> #include <linux/platform_device.h>
>> #include <linux/regmap.h>
>> @@ -13,6 +15,13 @@
>>
>> #include "reset-stm32.h"
>>
>> +/* Hold time between reset assertion and deassertion */
>> +#define STM32_RESET_ASSERT_DELAY_US 2
> Is this delay enough for all possible consumers, on all platforms that
> reset-stm32 supports?
Yes, you are right. Even if 2 us should cover a good part of the IPs,
I'll re-checkagainst STM32MP13/MP15/MP25 and use a conservative value in v2.
>
>> +
>> +/* Polling of the reset status bit after deassertion */
>> +#define STM32_RESET_DEASSERT_POLL_US 10
>> +#define STM32_RESET_DEASSERT_TIMEOUT_US (10 * USEC_PER_MSEC)
>> +
>> struct stm32_reset_data {
>> /* reset lock */
>> spinlock_t lock;
>> @@ -119,9 +128,45 @@ static int stm32_reset_status(struct reset_controller_dev *rcdev,
>> return !!(reg & BIT(ptr_line->bit_idx));
>> }
>>
>> +static int stm32_check_deassert(struct reset_controller_dev *rcdev,
>> + unsigned long id)
>> +{
>> + struct stm32_reset_data *data = to_stm32_reset_data(rcdev);
>> + struct stm32_reset_cfg line_reset;
>> + const struct stm32_reset_cfg *ptr_line;
>> + u32 reg;
>> +
>> + ptr_line = stm32_get_reset_line(rcdev, id, &line_reset);
>> + if (!ptr_line)
>> + return -EPERM;
>> +
>> + return readl_poll_timeout(data->membase + ptr_line->offset, reg,
>> + !(reg & BIT(ptr_line->bit_idx)),
>> + STM32_RESET_DEASSERT_POLL_US,
>> + STM32_RESET_DEASSERT_TIMEOUT_US);
>> +}
>> +
>> +static int stm32_reset(struct reset_controller_dev *rcdev, unsigned long id)
>> +{
>> + int ret;
>> +
>> + ret = stm32_reset_assert(rcdev, id);
>> + if (ret)
>> + return ret;
>> +
>> + fsleep(STM32_RESET_ASSERT_DELAY_US);
>> +
>> + ret = stm32_reset_deassert(rcdev, id);
>> + if (ret)
>> + return ret;
>> +
>> + return stm32_check_deassert(rcdev, id);
> If polling is necessary after deassertion, doesn't this be have to be
> moved into stm32_reset_deassert()?
Right, waiting for the line to be released is part of deassert, not of
reset. I'll move it there in v2.
Best regards,
Gabriel
> regards
> Philipp
prev parent reply other threads:[~2026-10-14 9:39 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-13 14:52 Gabriel Fernandez
2026-10-13 15:38 ` Philipp Zabel
2026-10-14 9:38 ` Gabriel FERNANDEZ [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4be10243-3937-4412-a8e2-92ea9fa098ff@foss.st.com \
--to=gabriel.fernandez@foss.st.com \
--cc=alexandre.torgue@foss.st.com \
--cc=bmasney+clk@redhat.com \
--cc=jbrunet+clk@baylibre.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=p.zabel@pengutronix.de \
--cc=sboyd@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®