[PATCH/RFC 08/14] reset: Add reset_controller_get_provider()

Geert Uytterhoeven
2026-04-21T18:12:38Z

The reset subsystem differs from the clock subsystem in multiple ways:
1. It does not provide a public way to lookup resets from a reset
provider (clock has of_clk_get_from_provider()),
2. The xlate callback does not return a reset object, but merely an
index, which is converted to a reset object by the reset core.

Hence add a public helper reset_controller_get_provider(), which just
returns the provider, and will be used by the R-Car X5H Module
Controller driver.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
drivers/reset/core.c | 11 +++++++++++
include/linux/reset-controller.h | 6 ++++++
2 files changed, 17 insertions(+)

diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index 38e189d04d09b270..57c427bb33b322e2 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -1135,6 +1135,17 @@ __reset_find_rcdev(const struct fwnode_reference_args *args, bool gpio_fallback)
return NULL;
}

+struct reset_controller_dev *
+reset_controller_get_provider(struct fwnode_handle *fwnode)
+{
+ struct fwnode_reference_args args = { .fwnode = fwnode };
+
+ guard(mutex)(&reset_list_mutex);
+
+ return __reset_find_rcdev(&args, false);
+}
+EXPORT_SYMBOL_GPL(reset_controller_get_provider);
+
struct reset_control *
__fwnode_reset_control_get(struct fwnode_handle *fwnode, const char *id, int index,
enum reset_control_flags flags)
diff --git a/include/linux/reset-controller.h b/include/linux/reset-controller.h
index 52a5a4e81f184407..0c17a36466115ba6 100644
--- a/include/linux/reset-controller.h
+++ b/include/linux/reset-controller.h
@@ -74,6 +74,7 @@ void reset_controller_unregister(struct reset_controller_dev *rcdev);
struct device;
int devm_reset_controller_register(struct device *dev,
struct reset_controller_dev *rcdev);
+struct reset_controller_dev *reset_controller_get_provider(struct fwnode_handle *fwnode);
#else
static inline int reset_controller_register(struct reset_controller_dev *rcdev)
{
@@ -89,6 +90,11 @@ static inline int devm_reset_controller_register(struct device *dev,
{
return 0;
}
+
+static inline struct reset_controller_dev *reset_controller_get_provider(struct fwnode_handle *fwnode)
+{
+ return NULL;
+}
#endif

#endif
--
2.43.0