[PATCH] clk: stm32: add support for reset_control_reset()
Gabriel FERNANDEZ
gabriel.fernandez at foss.st.com
Wed Oct 14 02:38:59 PDT 2026
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 at 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 at 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
More information about the linux-arm-kernel
mailing list