From: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
To: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Cc: Krzysztof Kozlowski <krzk@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
linux-kernel@vger.kernel.org, brgl@kernel.org,
linux-doc@vger.kernel.org
Subject: Re: [PATCH v3 13/14] reset: convert reset core to using firmware nodes
Date: Wed, 11 Mar 2026 16:47:57 +0100 [thread overview]
Message-ID: <abGOrRSJNB6zC8Vz@tom-desktop> (raw)
In-Reply-To: <20260306-reset-core-refactor-v3-13-599349522876@oss.qualcomm.com>
Hi Bartosz,
Thanks for your patch.
On Fri, Mar 06, 2026 at 06:22:57PM +0100, Bartosz Golaszewski wrote:
> With everything else now in place, we can convert the remaining parts of
> the reset subsystem to becoming fwnode-agnostic - meaning it will work
> with all kinds of firmware nodes, not only devicetree.
>
> To that end: extend struct reset_controller_dev with fields taking
> information relevant for using firmware nodes (which mirrors what we
> already do for OF-nodes) and limit using of_ APIs only to where it's
> absolutely necessary (mostly around the of_xlate callback).
>
> For backward compatibility of existing drivers we still support OF-nodes
> but firmware nodes become the preferred method.
>
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Just to share I'm seeing the following on RZ/G3E (next-20260310):
[ 16.806538] ------------[ cut here ]------------
[ 16.806546] WARNING: drivers/reset/core.c:1195 at __fwnode_reset_control_get+0x474/0x568, CPU#3: kworker/u16:0/11
[ 16.806566] Modules linked in: reset_rzv2h_usb2phy(+) rcar_canfd(+) rtc_isl1208 can_dev ecdh_generic ecc rfkill renesas_rpc_if fuse drm backlight ipv6
[ 16.806603] CPU: 3 UID: 0 PID: 11 Comm: kworker/u16:0 Not tainted 7.0.0-rc3-next-20260310-00016-g866b1999e3fc #17 PREEMPT
[ 16.806610] Hardware name: Renesas SMARC EVK version 2 based on r9a09g047e57 (DT)
[ 16.806615] Workqueue: events_unbound deferred_probe_work_func
[ 16.806627] pstate: 80400005 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[ 16.806632] pc : __fwnode_reset_control_get+0x474/0x568
[ 16.806638] lr : __fwnode_reset_control_get+0x164/0x568
[ 16.806644] sp : ffff800083263930
[ 16.806646] x29: ffff800083263a30 x28: ffff0000ff8370a8 x27: ffff800081d8d590
[ 16.806655] x26: ffff800081e3a6c8 x25: ffff800082fec430 x24: ffff800082fec450
[ 16.806663] x23: 0000000000000000 x22: 0000000000000003 x21: ffff0000ff835940
[ 16.806671] x20: 0000000000000000 x19: ffff0000c0294e98 x18: 00000000ffffffff
[ 16.806679] x17: 6e6f637478652f79 x16: 68702d6273752e30 x15: 303230303835312f
[ 16.806687] x14: ffff8000831a6200 x13: 00363038343d4d55 x12: 0000000000000000
[ 16.806695] x11: 7478653d4d455453 x10: ffff8000827b0ab7 x9 : 0000000000000028
[ 16.806703] x8 : 0101010101010101 x7 : 00000000736c6c65 x6 : 000000000080a3f0
[ 16.806711] x5 : ffff800083263864 x4 : ffffffffff604034 x3 : 0000000000000000
[ 16.806719] x2 : ffff0000c0128fc0 x1 : 0000000000000000 x0 : 0000000000000001
[ 16.806727] Call trace:
[ 16.806731] __fwnode_reset_control_get+0x474/0x568 (P)
[ 16.806738] fwnode_reset_control_array_get+0x84/0x134
[ 16.806745] devm_reset_control_array_get+0x54/0xb4
[ 16.806751] rcar_gen3_phy_usb2_probe+0x108/0x5b8
[ 16.806762] platform_probe+0x5c/0x98
[ 16.806770] really_probe+0xbc/0x29c
[ 16.806776] __driver_probe_device+0x78/0x12c
[ 16.806782] driver_probe_device+0x3c/0x15c
[ 16.806789] __device_attach_driver+0xb8/0x134
[ 16.806795] bus_for_each_drv+0x88/0xe8
[ 16.806802] __device_attach+0xa0/0x190
[ 16.806808] device_initial_probe+0x50/0x54
[ 16.806814] bus_probe_device+0x38/0xa4
[ 16.806820] deferred_probe_work_func+0x88/0xc0
[ 16.806826] process_one_work+0x154/0x294
[ 16.806835] worker_thread+0x180/0x300
[ 16.806840] kthread+0x118/0x124
[ 16.806847] ret_from_fork+0x10/0x20
[ 16.806856] ---[ end trace 0000000000000000 ]---
[ 16.806867] phy_rcar_gen3_usb2 15800200.usb-phy: probe with driver phy_rcar_gen3_usb2 failed with error -22
Hope this help.
Thanks & Regards,
Tommaso
> ---
> drivers/reset/core.c | 166 +++++++++++++++++++++++----------------
> include/linux/reset-controller.h | 14 +++-
> 2 files changed, 112 insertions(+), 68 deletions(-)
>
> diff --git a/drivers/reset/core.c b/drivers/reset/core.c
> index 0817afe72de75f795d62e02451520726da7c9844..e33a9bc9f94fc6867be6efd32178658d99fc088f 100644
> --- a/drivers/reset/core.c
> +++ b/drivers/reset/core.c
> @@ -81,13 +81,13 @@ struct reset_control_array {
>
> /**
> * struct reset_gpio_lookup - lookup key for ad-hoc created reset-gpio devices
> - * @of_args: phandle to the reset controller with all the args like GPIO number
> + * @ref_args: Reference to the reset controller with all the args like GPIO number
> * @swnode: Software node containing the reference to the GPIO provider
> * @list: list entry for the reset_gpio_lookup_list
> * @adev: Auxiliary device representing the reset controller
> */
> struct reset_gpio_lookup {
> - struct of_phandle_args of_args;
> + struct fwnode_reference_args ref_args;
> struct fwnode_handle *swnode;
> struct list_head list;
> struct auxiliary_device adev;
> @@ -98,24 +98,24 @@ static const char *rcdev_name(struct reset_controller_dev *rcdev)
> if (rcdev->dev)
> return dev_name(rcdev->dev);
>
> - if (rcdev->of_node)
> - return rcdev->of_node->full_name;
> + if (rcdev->fwnode)
> + return fwnode_get_name(rcdev->fwnode);
>
> return NULL;
> }
>
> /**
> - * of_reset_simple_xlate - translate reset_spec to the reset line number
> + * fwnode_reset_simple_xlate - translate reset_spec to the reset line number
> * @rcdev: a pointer to the reset controller device
> - * @reset_spec: reset line specifier as found in the device tree
> + * @reset_spec: reset line specifier as found in firmware
> *
> - * This static translation function is used by default if of_xlate in
> - * :c:type:`reset_controller_dev` is not set. It is useful for all reset
> - * controllers with 1:1 mapping, where reset lines can be indexed by number
> - * without gaps.
> + * This static translation function is used by default if neither fwnode_xlate
> + * not of_xlate in :c:type:`reset_controller_dev` is not set. It is useful for
> + * all reset controllers with 1:1 mapping, where reset lines can be indexed by
> + * number without gaps.
> */
> -static int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
> - const struct of_phandle_args *reset_spec)
> +static int fwnode_reset_simple_xlate(struct reset_controller_dev *rcdev,
> + const struct fwnode_reference_args *reset_spec)
> {
> if (reset_spec->args[0] >= rcdev->nr_resets)
> return -EINVAL;
> @@ -129,9 +129,23 @@ static int of_reset_simple_xlate(struct reset_controller_dev *rcdev,
> */
> int reset_controller_register(struct reset_controller_dev *rcdev)
> {
> - if (!rcdev->of_xlate) {
> - rcdev->of_reset_n_cells = 1;
> - rcdev->of_xlate = of_reset_simple_xlate;
> + if ((rcdev->of_node && rcdev->fwnode) || (rcdev->of_xlate && rcdev->fwnode_xlate))
> + return -EINVAL;
> +
> + if (!rcdev->of_node && !rcdev->fwnode) {
> + rcdev->fwnode = dev_fwnode(rcdev->dev);
> + if (!rcdev->fwnode)
> + return -EINVAL;
> + }
> +
> + if (rcdev->of_node) {
> + rcdev->fwnode = of_fwnode_handle(rcdev->of_node);
> + rcdev->fwnode_reset_n_cells = rcdev->of_reset_n_cells;
> + }
> +
> + if (rcdev->fwnode && !rcdev->fwnode_xlate) {
> + rcdev->fwnode_reset_n_cells = 1;
> + rcdev->fwnode_xlate = fwnode_reset_simple_xlate;
> }
>
> INIT_LIST_HEAD(&rcdev->reset_control_head);
> @@ -931,7 +945,7 @@ static int reset_create_gpio_aux_device(struct reset_gpio_lookup *rgpio_dev,
> adev->id = id;
> adev->name = "gpio";
> adev->dev.parent = parent;
> - adev->dev.platform_data = &rgpio_dev->of_args;
> + adev->dev.platform_data = &rgpio_dev->ref_args;
> adev->dev.release = reset_gpio_aux_device_release;
> device_set_node(&adev->dev, rgpio_dev->swnode);
>
> @@ -951,18 +965,18 @@ static int reset_create_gpio_aux_device(struct reset_gpio_lookup *rgpio_dev,
> return 0;
> }
>
> -static void reset_gpio_add_devlink(struct device_node *np,
> +static void reset_gpio_add_devlink(struct fwnode_handle *fwnode,
> struct reset_gpio_lookup *rgpio_dev)
> {
> struct device *consumer;
>
> /*
> - * We must use get_dev_from_fwnode() and not of_find_device_by_node()
> + * We must use get_dev_from_fwnode() and not ref_find_device_by_node()
> * because the latter only considers the platform bus while we want to
> * get consumers of any kind that can be associated with firmware
> * nodes: auxiliary, soundwire, etc.
> */
> - consumer = get_dev_from_fwnode(of_fwnode_handle(np));
> + consumer = get_dev_from_fwnode(fwnode);
> if (consumer) {
> if (!device_link_add(consumer, &rgpio_dev->adev.dev,
> DL_FLAG_AUTOREMOVE_CONSUMER))
> @@ -982,15 +996,23 @@ static void reset_gpio_add_devlink(struct device_node *np,
> */
> }
>
> +/* TODO: move it out into drivers/base/ */
> +static bool fwnode_reference_args_equal(const struct fwnode_reference_args *left,
> + const struct fwnode_reference_args *right)
> +{
> + return left->fwnode == right->fwnode && left->nargs == right->nargs &&
> + !memcmp(left->args, right->args, sizeof(left->args[0]) * left->nargs);
> +}
> +
> /*
> * @np: OF-node associated with the consumer
> - * @args: phandle to the GPIO provider with all the args like GPIO number
> + * @args: Reference to the GPIO provider with all the args like GPIO number
> */
> -static int __reset_add_reset_gpio_device(struct device_node *np,
> - const struct of_phandle_args *args)
> +static int __reset_add_reset_gpio_device(struct fwnode_handle *fwnode,
> + const struct fwnode_reference_args *args)
> {
> struct property_entry properties[3] = { };
> - unsigned int offset, of_flags, lflags;
> + unsigned int offset, flags, lflags;
> struct reset_gpio_lookup *rgpio_dev;
> struct device *parent;
> int ret, prop = 0;
> @@ -1001,7 +1023,7 @@ static int __reset_add_reset_gpio_device(struct device_node *np,
> * args[1]: GPIO flags
> * TODO: Handle other cases.
> */
> - if (args->args_count != 2)
> + if (args->nargs != 2)
> return -ENOENT;
>
> /*
> @@ -1012,7 +1034,7 @@ static int __reset_add_reset_gpio_device(struct device_node *np,
> lockdep_assert_not_held(&reset_list_mutex);
>
> offset = args->args[0];
> - of_flags = args->args[1];
> + flags = args->args[1];
>
> /*
> * Later we map GPIO flags between OF and Linux, however not all
> @@ -1022,33 +1044,31 @@ static int __reset_add_reset_gpio_device(struct device_node *np,
> * FIXME: Find a better way of translating OF flags to GPIO lookup
> * flags.
> */
> - if (of_flags > GPIO_ACTIVE_LOW) {
> + if (flags > GPIO_ACTIVE_LOW) {
> pr_err("reset-gpio code does not support GPIO flags %u for GPIO %u\n",
> - of_flags, offset);
> + flags, offset);
> return -EINVAL;
> }
>
> struct gpio_device *gdev __free(gpio_device_put) =
> - gpio_device_find_by_fwnode(of_fwnode_handle(args->np));
> + gpio_device_find_by_fwnode(args->fwnode);
> if (!gdev)
> return -EPROBE_DEFER;
>
> guard(mutex)(&reset_gpio_lookup_mutex);
>
> list_for_each_entry(rgpio_dev, &reset_gpio_lookup_list, list) {
> - if (args->np == rgpio_dev->of_args.np) {
> - if (of_phandle_args_equal(args, &rgpio_dev->of_args)) {
> - /*
> - * Already on the list, create the device link
> - * and stop here.
> - */
> - reset_gpio_add_devlink(np, rgpio_dev);
> - return 0;
> - }
> + if (fwnode_reference_args_equal(args, &rgpio_dev->ref_args)) {
> + /*
> + * Already on the list, create the device link
> + * and stop here.
> + */
> + reset_gpio_add_devlink(fwnode, rgpio_dev);
> + return 0;
> }
> }
>
> - lflags = GPIO_PERSISTENT | (of_flags & GPIO_ACTIVE_LOW);
> + lflags = GPIO_PERSISTENT | (flags & GPIO_ACTIVE_LOW);
> parent = gpio_device_to_device(gdev);
> properties[prop++] = PROPERTY_ENTRY_STRING("compatible", "reset-gpio");
> properties[prop++] = PROPERTY_ENTRY_GPIO("reset-gpios", parent->fwnode, offset, lflags);
> @@ -1058,43 +1078,43 @@ static int __reset_add_reset_gpio_device(struct device_node *np,
> if (!rgpio_dev)
> return -ENOMEM;
>
> - rgpio_dev->of_args = *args;
> + rgpio_dev->ref_args = *args;
> /*
> - * We keep the device_node reference, but of_args.np is put at the end
> - * of __fwnode_reset_control_get(), so get it one more time.
> + * We keep the fwnode_handle reference, but ref_args.fwnode is put at
> + * the end of __fwnode_reset_control_get(), so get it one more time.
> * Hold reference as long as rgpio_dev memory is valid.
> */
> - of_node_get(rgpio_dev->of_args.np);
> + fwnode_handle_get(rgpio_dev->ref_args.fwnode);
>
> rgpio_dev->swnode = fwnode_create_software_node(properties, NULL);
> if (IS_ERR(rgpio_dev->swnode)) {
> ret = PTR_ERR(rgpio_dev->swnode);
> - goto err_put_of_node;
> + goto err_put_fwnode;
> }
>
> ret = reset_create_gpio_aux_device(rgpio_dev, parent);
> if (ret)
> goto err_del_swnode;
>
> - reset_gpio_add_devlink(np, rgpio_dev);
> + reset_gpio_add_devlink(fwnode, rgpio_dev);
> list_add(&rgpio_dev->list, &reset_gpio_lookup_list);
>
> return 0;
>
> err_del_swnode:
> fwnode_remove_software_node(rgpio_dev->swnode);
> -err_put_of_node:
> - of_node_put(rgpio_dev->of_args.np);
> +err_put_fwnode:
> + fwnode_handle_put(rgpio_dev->ref_args.fwnode);
> kfree(rgpio_dev);
>
> return ret;
> }
>
> -static struct reset_controller_dev *__reset_find_rcdev(const struct of_phandle_args *args,
> - bool gpio_fallback)
> +static struct reset_controller_dev *
> +__reset_find_rcdev(const struct fwnode_reference_args *args, bool gpio_fallback)
> {
> + struct fwnode_reference_args *rc_args;
> struct reset_controller_dev *rcdev;
> - struct of_phandle_args *rc_args;
>
> lockdep_assert_held(&reset_list_mutex);
>
> @@ -1103,10 +1123,10 @@ static struct reset_controller_dev *__reset_find_rcdev(const struct of_phandle_a
> device_is_compatible(rcdev->dev, "reset-gpio")) {
> rc_args = dev_get_platdata(rcdev->dev);
>
> - if (of_phandle_args_equal(args, rc_args))
> + if (fwnode_reference_args_equal(args, rc_args))
> return rcdev;
> } else {
> - if (args->np == rcdev->of_node)
> + if (args->fwnode == rcdev->fwnode)
> return rcdev;
> }
> }
> @@ -1120,27 +1140,26 @@ __fwnode_reset_control_get(struct fwnode_handle *fwnode, const char *id, int ind
> {
> bool optional = flags & RESET_CONTROL_FLAGS_BIT_OPTIONAL;
> bool gpio_fallback = false;
> - struct device_node *node = to_of_node(fwnode);
> struct reset_control *rstc = ERR_PTR(-EINVAL);
> struct reset_controller_dev *rcdev;
> - struct of_phandle_args args;
> - int rstc_id;
> + struct fwnode_reference_args args;
> + struct of_phandle_args of_args;
> + int rstc_id = -EINVAL;
> int ret;
>
> if (!fwnode)
> return ERR_PTR(-EINVAL);
>
> if (id) {
> - index = of_property_match_string(node,
> - "reset-names", id);
> + index = fwnode_property_match_string(fwnode, "reset-names", id);
> if (index == -EILSEQ)
> return ERR_PTR(index);
> if (index < 0)
> return optional ? NULL : ERR_PTR(-ENOENT);
> }
>
> - ret = of_parse_phandle_with_args(node, "resets", "#reset-cells",
> - index, &args);
> + ret = fwnode_property_get_reference_args(fwnode, "resets", "#reset-cells",
> + 0, index, &args);
> if (ret == -EINVAL)
> return ERR_PTR(ret);
> if (ret) {
> @@ -1151,16 +1170,16 @@ __fwnode_reset_control_get(struct fwnode_handle *fwnode, const char *id, int ind
> * There can be only one reset-gpio for regular devices, so
> * don't bother with the "reset-gpios" phandle index.
> */
> - ret = of_parse_phandle_with_args(node, "reset-gpios", "#gpio-cells",
> - 0, &args);
> + ret = fwnode_property_get_reference_args(fwnode, "reset-gpios",
> + "#gpio-cells", 0, 0, &args);
> if (ret)
> return optional ? NULL : ERR_PTR(ret);
>
> gpio_fallback = true;
>
> - ret = __reset_add_reset_gpio_device(node, &args);
> + ret = __reset_add_reset_gpio_device(fwnode, &args);
> if (ret) {
> - of_node_put(args.np);
> + fwnode_handle_put(args.fwnode);
> return ERR_PTR(ret);
> }
> }
> @@ -1173,15 +1192,30 @@ __fwnode_reset_control_get(struct fwnode_handle *fwnode, const char *id, int ind
> goto out_put;
> }
>
> - if (WARN_ON(args.args_count != rcdev->of_reset_n_cells)) {
> + if (WARN_ON(args.nargs != rcdev->fwnode_reset_n_cells)) {
> rstc = ERR_PTR(-EINVAL);
> goto out_put;
> }
>
> - rstc_id = rcdev->of_xlate(rcdev, &args);
> + if (rcdev->of_xlate && is_of_node(fwnode)) {
> + ret = of_parse_phandle_with_args(to_of_node(fwnode),
> + gpio_fallback ? "reset-gpios" : "resets",
> + gpio_fallback ? "#gpio-cells" : "#reset-cells",
> + gpio_fallback ? 0 : index,
> + &of_args);
> + if (ret) {
> + rstc = ERR_PTR(ret);
> + goto out_put;
> + }
> +
> + rstc_id = rcdev->of_xlate(rcdev, &of_args);
> + of_node_put(of_args.np);
> + } else if (rcdev->fwnode_xlate) {
> + rstc_id = rcdev->fwnode_xlate(rcdev, &args);
> + }
> if (rstc_id < 0) {
> rstc = ERR_PTR(rstc_id);
> - goto out_put;
> + goto out_put;
> }
>
> flags &= ~RESET_CONTROL_FLAGS_BIT_OPTIONAL;
> @@ -1190,7 +1224,7 @@ __fwnode_reset_control_get(struct fwnode_handle *fwnode, const char *id, int ind
> rstc = __reset_control_get_internal(rcdev, rstc_id, flags);
>
> out_put:
> - of_node_put(args.np);
> + fwnode_handle_put(args.fwnode);
>
> return rstc;
> }
> diff --git a/include/linux/reset-controller.h b/include/linux/reset-controller.h
> index 185d2a9bd7cd381ddc51c0f1643c4e3cb196015e..52a5a4e81f1844075210339bf7ffa46ec5ca6edf 100644
> --- a/include/linux/reset-controller.h
> +++ b/include/linux/reset-controller.h
> @@ -5,6 +5,8 @@
> #include <linux/list.h>
> #include <linux/mutex.h>
>
> +struct fwnode_handle;
> +struct fwnode_reference_args;
> struct reset_controller_dev;
>
> /**
> @@ -38,8 +40,12 @@ struct of_phandle_args;
> * @of_node: corresponding device tree node as phandle target
> * @of_reset_n_cells: number of cells in reset line specifiers
> * @of_xlate: translation function to translate from specifier as found in the
> - * device tree to id as given to the reset control ops, defaults
> - * to :c:func:`of_reset_simple_xlate`.
> + * device tree to id as given to the reset control ops
> + * @fwnode: firmware node associated with this device
> + * @fwnode_reset_n_cells: number of cells in reset line specifiers
> + * @fwnode_xlate: translation function to translate from firmware specifier to
> + * id as given to the reset control ops, defaults to
> + * :c:func:`fwnode_reset_simple_xlate`
> * @nr_resets: number of reset controls in this reset controller device
> * @lock: protects the reset control list from concurrent access
> */
> @@ -53,6 +59,10 @@ struct reset_controller_dev {
> int of_reset_n_cells;
> int (*of_xlate)(struct reset_controller_dev *rcdev,
> const struct of_phandle_args *reset_spec);
> + struct fwnode_handle *fwnode;
> + int fwnode_reset_n_cells;
> + int (*fwnode_xlate)(struct reset_controller_dev *rcdev,
> + const struct fwnode_reference_args *reset_spec);
> unsigned int nr_resets;
> struct mutex lock;
> };
>
> --
> 2.47.3
>
next prev parent reply other threads:[~2026-03-11 15:48 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-06 17:22 [PATCH v3 00/14] reset: major reset core refactoring Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 01/14] reset: gpio: remove unneeded OF-node put Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 02/14] reset: gpio: add a devlink between reset-gpio and its consumer Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 03/14] reset: gpio: simplify fallback device matching Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 04/14] reset: gpio: remove unneeded auxiliary_set_drvdata() Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 05/14] reset: warn on reset-gpio release Bartosz Golaszewski
2026-03-09 9:21 ` Philipp Zabel
2026-03-06 17:22 ` [PATCH v3 06/14] reset: fold ida_alloc() into reset_create_gpio_aux_device() Bartosz Golaszewski
2026-03-09 7:47 ` Philipp Zabel
2026-03-06 17:22 ` [PATCH v3 07/14] reset: use lock guards in reset core Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 08/14] reset: handle removing supplier before consumers Bartosz Golaszewski
2026-03-09 7:47 ` Philipp Zabel
2026-03-06 17:22 ` [PATCH v3 09/14] reset: protect struct reset_controller_dev with its own mutex Bartosz Golaszewski
2026-03-09 8:01 ` Philipp Zabel
2026-03-06 17:22 ` [PATCH v3 10/14] reset: protect struct reset_control " Bartosz Golaszewski
2026-03-09 8:01 ` Philipp Zabel
2026-03-06 17:22 ` [PATCH v3 11/14] reset: convert of_reset_control_get_count() to using firmware nodes Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 12/14] reset: convert the core API " Bartosz Golaszewski
2026-03-06 17:22 ` [PATCH v3 13/14] reset: convert reset core " Bartosz Golaszewski
2026-03-09 8:01 ` Philipp Zabel
2026-03-10 14:16 ` Mark Brown
2026-03-10 14:48 ` Philipp Zabel
2026-03-10 14:53 ` Bartosz Golaszewski
2026-03-10 15:00 ` Geert Uytterhoeven
2026-03-11 15:47 ` Tommaso Merciai [this message]
2026-03-11 15:54 ` Bartosz Golaszewski
2026-03-11 16:06 ` Tommaso Merciai
2026-03-06 17:22 ` [PATCH v3 14/14] reset: gpio: make the driver fwnode-agnostic Bartosz Golaszewski
2026-03-09 9:25 ` [PATCH v3 00/14] reset: major reset core refactoring Philipp Zabel
2026-03-09 9:34 ` Bartosz Golaszewski
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=abGOrRSJNB6zC8Vz@tom-desktop \
--to=tommaso.merciai.xr@bp.renesas.com \
--cc=bartosz.golaszewski@oss.qualcomm.com \
--cc=brgl@kernel.org \
--cc=corbet@lwn.net \
--cc=krzk@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=skhan@linuxfoundation.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