mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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

      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®