* [PATCH v9 1/6] mux: Add driver for Renesas RZ/V2H USB VBENCTL VBUS_SEL mux
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 2/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Add '#mux-state-cells' property Tommaso Merciai
` (5 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel
As per the RZ/V2H(P) HW manual, VBUSEN can be controlled by the VBUS_SEL
bit of the VBENCTL Control Register. This register is mapped in the
reset framework. The reset driver expose this register as mux-controller
and instantiates this driver. The consumer will use the mux API to
control the VBUS_SEL bit.
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- Fixed driver comment year (2025 -> 2026)
- Switch from devm_regmap_init_mmio() to dev_get_regmap().
- Drop unnecessasry include bitops.h, of.h, property.h and
drivers/reset/reset-rzv2h-usb2phy.h headers, driver is now based on regmap.
- Collected PZabel tag.
v7->v8:
- No changes.
v6->v7:
- No changes.
v5->v6:
- No changes.
v4->v5:
- Changed file name to rzv2h-usb-vbenctl.c and Fixed
Makefile, Kconfig, function names accordingly.
- Changed driver .name to "vbenctl" and fix auxiliary_device_id name.
- Updated commit msg.
v3->v4:
- Removed mux_chip->dev.of_node not needed.
v2->v3:
- Added mux_chip->dev.of_node = dev->of_node->child as the mux-controller
is an internal node.
- Fixed auxiliary_device_id name.
- Get rdev using from platform_data.
- Drop struct auxiliary_device adev from reset_rzv2h_usb2phy_adev
as it is needed.
- Drop to_reset_rzv2h_usb2phy_adev() as it is not needed.
v1->v2:
- New patch
drivers/mux/Kconfig | 11 +++++
drivers/mux/Makefile | 2 +
drivers/mux/rzv2h-usb-vbenctl.c | 85 +++++++++++++++++++++++++++++++++
3 files changed, 98 insertions(+)
create mode 100644 drivers/mux/rzv2h-usb-vbenctl.c
diff --git a/drivers/mux/Kconfig b/drivers/mux/Kconfig
index 6d17dfa25dad..7f334540c189 100644
--- a/drivers/mux/Kconfig
+++ b/drivers/mux/Kconfig
@@ -70,6 +70,17 @@ config MUX_MMIO
To compile the driver as a module, choose M here: the module will
be called mux-mmio.
+config MUX_RZV2H_USB_VBENCTL
+ tristate "Renesas RZ/V2H USB VBENCTL VBUS_SEL mux driver"
+ depends on RESET_RZV2H_USB2PHY || COMPILE_TEST
+ depends on OF
+ select REGMAP
+ select AUXILIARY_BUS
+ default RESET_RZV2H_USB2PHY
+ help
+ Support for USB VBENCTL VBUS_SEL mux implemented on Renesas
+ RZ/V2H SoCs.
+
endmenu
endif # MULTIPLEXER
diff --git a/drivers/mux/Makefile b/drivers/mux/Makefile
index 6e9fa47daf56..3bd9b3846835 100644
--- a/drivers/mux/Makefile
+++ b/drivers/mux/Makefile
@@ -8,9 +8,11 @@ mux-adg792a-objs := adg792a.o
mux-adgs1408-objs := adgs1408.o
mux-gpio-objs := gpio.o
mux-mmio-objs := mmio.o
+mux-rzv2h-usb-vbenctl-objs := rzv2h-usb-vbenctl.o
obj-$(CONFIG_MULTIPLEXER) += mux-core.o
obj-$(CONFIG_MUX_ADG792A) += mux-adg792a.o
obj-$(CONFIG_MUX_ADGS1408) += mux-adgs1408.o
obj-$(CONFIG_MUX_GPIO) += mux-gpio.o
obj-$(CONFIG_MUX_MMIO) += mux-mmio.o
+obj-$(CONFIG_MUX_RZV2H_USB_VBENCTL) += mux-rzv2h-usb-vbenctl.o
diff --git a/drivers/mux/rzv2h-usb-vbenctl.c b/drivers/mux/rzv2h-usb-vbenctl.c
new file mode 100644
index 000000000000..79197fddbf74
--- /dev/null
+++ b/drivers/mux/rzv2h-usb-vbenctl.c
@@ -0,0 +1,85 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Renesas RZ/V2H(P) USB VBENCTL VBUS_SEL mux driver
+ *
+ * Copyright (C) 2026 Renesas Electronics Corp.
+ */
+
+#include <linux/auxiliary_bus.h>
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/mux/driver.h>
+#include <linux/regmap.h>
+
+#define RZV2H_VBENCTL 0xf0c
+
+struct mux_rzv2h_usb_vbenctl_priv {
+ struct regmap_field *field;
+};
+
+static int mux_rzv2h_usb_vbenctl_set(struct mux_control *mux, int state)
+{
+ struct mux_rzv2h_usb_vbenctl_priv *priv = mux_chip_priv(mux->chip);
+
+ return regmap_field_write(priv->field, state);
+}
+
+static const struct mux_control_ops mux_rzv2h_usb_vbenctl_ops = {
+ .set = mux_rzv2h_usb_vbenctl_set,
+};
+
+static int mux_rzv2h_usb_vbenctl_probe(struct auxiliary_device *adev,
+ const struct auxiliary_device_id *id)
+{
+ struct mux_rzv2h_usb_vbenctl_priv *priv;
+ struct device *dev = &adev->dev;
+ struct mux_chip *mux_chip;
+ struct regmap *regmap;
+ struct reg_field reg_field = {
+ .reg = RZV2H_VBENCTL,
+ .lsb = 0,
+ .msb = 0,
+ };
+ int ret;
+
+ regmap = dev_get_regmap(adev->dev.parent, NULL);
+ if (!regmap)
+ return -ENODEV;
+
+ mux_chip = devm_mux_chip_alloc(dev, 1, sizeof(*priv));
+ if (IS_ERR(mux_chip))
+ return PTR_ERR(mux_chip);
+
+ priv = mux_chip_priv(mux_chip);
+
+ priv->field = devm_regmap_field_alloc(dev, regmap, reg_field);
+ if (IS_ERR(priv->field))
+ return PTR_ERR(priv->field);
+
+ mux_chip->ops = &mux_rzv2h_usb_vbenctl_ops;
+ mux_chip->mux[0].states = 2;
+ mux_chip->mux[0].idle_state = MUX_IDLE_AS_IS;
+
+ ret = devm_mux_chip_register(dev, mux_chip);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "Failed to register mux chip\n");
+
+ return 0;
+}
+
+static const struct auxiliary_device_id mux_rzv2h_usb_vbenctl_ids[] = {
+ { .name = "rzv2h_usb2phy_reset.vbenctl" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(auxiliary, mux_rzv2h_usb_vbenctl_ids);
+
+static struct auxiliary_driver mux_rzv2h_usb_vbenctl_driver = {
+ .name = "vbenctl",
+ .probe = mux_rzv2h_usb_vbenctl_probe,
+ .id_table = mux_rzv2h_usb_vbenctl_ids,
+};
+module_auxiliary_driver(mux_rzv2h_usb_vbenctl_driver);
+
+MODULE_DESCRIPTION("RZ/V2H USB VBENCTL VBUS_SEL mux driver");
+MODULE_AUTHOR("Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>");
+MODULE_LICENSE("GPL");
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v9 2/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Add '#mux-state-cells' property
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 1/6] mux: Add driver for Renesas RZ/V2H USB VBENCTL VBUS_SEL mux Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 3/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Document RZ/G3E USB2PHY reset Tommaso Merciai
` (4 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel, Krzysztof Kozlowski
Add the '#mux-state-cells' property to support describing the USB VBUS_SEL
multiplexer as a mux-controller in the Renesas RZ/V2H(P) USB2PHY binding.
The mux-controller cannot be integrated into the parent USB2PHY node
because the VBUS source selector is part of a separate hardware block,
not the USB2PHY block itself.
This is required to properly configure USB PHY power selection on
RZ/V2H(P) and RZ/G3E SoCs.
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- No changes
v7->v8:
- No changes
v6->v7:
- No changes
v5->v6:
- Collected KKrzysztof tag
v4->v5:
- No changes
v3->v4:
- Switch back to v2 implementation.
- Improve commit body.
v2->v3:
- Manipulate mux-controller as an internal node.
- Improved commit body.
v1->v2:
- New patch
.../bindings/reset/renesas,rzv2h-usb2phy-reset.yaml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml b/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
index c1b800a10b53..7ed0980b9ee1 100644
--- a/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
+++ b/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
@@ -37,6 +37,9 @@ properties:
'#reset-cells':
const: 0
+ '#mux-state-cells':
+ const: 1
+
required:
- compatible
- reg
@@ -44,6 +47,7 @@ required:
- resets
- power-domains
- '#reset-cells'
+ - '#mux-state-cells'
additionalProperties: false
@@ -58,4 +62,5 @@ examples:
resets = <&cpg 0xaf>;
power-domains = <&cpg>;
#reset-cells = <0>;
+ #mux-state-cells = <1>;
};
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v9 3/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Document RZ/G3E USB2PHY reset
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 1/6] mux: Add driver for Renesas RZ/V2H USB VBENCTL VBUS_SEL mux Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 2/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Add '#mux-state-cells' property Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 4/6] reset: rzv2h-usb2phy: Keep PHY clock enabled for entire device lifetime Tommaso Merciai
` (3 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel, Conor Dooley
Document USB2PHY reset controller bindings for RZ/G3E ("R9A09G047") SoC.
The RZ/G3E USB2PHY reset controller is functionally identical to the one
found on the RZ/V2H(P), so no driver changes are needed. The existing
"renesas,r9a09g057-usb2phy-reset" will be used as a fallback compatible
for this IP.
Acked-by: Conor Dooley <conor.dooley@microchip.com>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- No changes
v7->v8:
- No changes
v6->v7:
- No changes
v5->v6:
- Fixed commit msg
v4->v5:
- No changes
v3->v4:
- No changes
v2->v3:
- No changes
v1->v2:
- Collected CDooley tag
.../bindings/reset/renesas,rzv2h-usb2phy-reset.yaml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml b/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
index 7ed0980b9ee1..66650ef8f772 100644
--- a/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
+++ b/Documentation/devicetree/bindings/reset/renesas,rzv2h-usb2phy-reset.yaml
@@ -17,7 +17,9 @@ properties:
compatible:
oneOf:
- items:
- - const: renesas,r9a09g056-usb2phy-reset # RZ/V2N
+ - enum:
+ - renesas,r9a09g047-usb2phy-reset # RZ/G3E
+ - renesas,r9a09g056-usb2phy-reset # RZ/V2N
- const: renesas,r9a09g057-usb2phy-reset
- const: renesas,r9a09g057-usb2phy-reset # RZ/V2H(P)
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v9 4/6] reset: rzv2h-usb2phy: Keep PHY clock enabled for entire device lifetime
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
` (2 preceding siblings ...)
2026-03-27 18:08 ` [PATCH v9 3/6] dt-bindings: reset: renesas,rzv2h-usb2phy: Document RZ/G3E USB2PHY reset Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-27 18:08 ` [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API Tommaso Merciai
` (2 subsequent siblings)
6 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel, stable
The driver was disabling the USB2 PHY clock immediately after register
initialization in probe() and after each reset operation. This left the
PHY unclocked even though it must remain active for USB functionality.
The behavior appeared to work only when another driver
(e.g., USB controller) had already enabled the clock, making operation
unreliable and hardware-dependent. In configurations where this driver
is the sole clock user, USB functionality would fail.
Fix this by:
- Enabling the clock once in probe() via pm_runtime_resume_and_get()
- Removing all pm_runtime_put() calls from assert/deassert/status
- Registering a devm cleanup action to release the clock at removal
- Removed rzv2h_usbphy_assert_helper() and its call in
rzv2h_usb2phy_reset_probe()
This ensures the PHY clock remains enabled for the entire device lifetime,
preventing instability and aligning with hardware requirements.
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Cc: stable@vger.kernel.org
Fixes: e3911d7f865b ("reset: Add USB2PHY port reset driver for Renesas RZ/V2H(P)")
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- Collected PZabel tag.
v7->v8:
- No changes
v6->v7:
- No changes
v5->v6:
- No changes
v4->v5:
- No changes.
v3->v4:
- No changes.
v2->v3:
- Added missing Cc: stable@vger.kernel.org
- Improved commit body describing the removal of rzv2h_usbphy_assert_helper()
from rzv2h_usb2phy_reset_probe().
v1->v2:
- Improve commit body and commit msg
- Added Fixes tag
- Dropped unnecessary rzv2h_usbphy_assert_helper() functio
drivers/reset/reset-rzv2h-usb2phy.c | 64 ++++++++---------------------
1 file changed, 18 insertions(+), 46 deletions(-)
diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
index ae643575b067..5bdd39274612 100644
--- a/drivers/reset/reset-rzv2h-usb2phy.c
+++ b/drivers/reset/reset-rzv2h-usb2phy.c
@@ -49,9 +49,10 @@ static inline struct rzv2h_usb2phy_reset_priv
return container_of(rcdev, struct rzv2h_usb2phy_reset_priv, rcdev);
}
-/* This function must be called only after pm_runtime_resume_and_get() has been called */
-static void rzv2h_usbphy_assert_helper(struct rzv2h_usb2phy_reset_priv *priv)
+static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
+ unsigned long id)
{
+ struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
scoped_guard(spinlock, &priv->lock) {
@@ -60,24 +61,6 @@ static void rzv2h_usbphy_assert_helper(struct rzv2h_usb2phy_reset_priv *priv)
}
usleep_range(11, 20);
-}
-
-static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
- unsigned long id)
-{
- struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
- struct device *dev = priv->dev;
- int ret;
-
- ret = pm_runtime_resume_and_get(dev);
- if (ret) {
- dev_err(dev, "pm_runtime_resume_and_get failed\n");
- return ret;
- }
-
- rzv2h_usbphy_assert_helper(priv);
-
- pm_runtime_put(dev);
return 0;
}
@@ -87,14 +70,6 @@ static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
{
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
- struct device *dev = priv->dev;
- int ret;
-
- ret = pm_runtime_resume_and_get(dev);
- if (ret) {
- dev_err(dev, "pm_runtime_resume_and_get failed\n");
- return ret;
- }
scoped_guard(spinlock, &priv->lock) {
writel(data->reset_deassert_val, priv->base + data->reset_reg);
@@ -102,8 +77,6 @@ static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
writel(data->reset_release_val, priv->base + data->reset_reg);
}
- pm_runtime_put(dev);
-
return 0;
}
@@ -111,20 +84,10 @@ static int rzv2h_usbphy_reset_status(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
- struct device *dev = priv->dev;
- int ret;
u32 reg;
- ret = pm_runtime_resume_and_get(dev);
- if (ret) {
- dev_err(dev, "pm_runtime_resume_and_get failed\n");
- return ret;
- }
-
reg = readl(priv->base + priv->data->reset_reg);
- pm_runtime_put(dev);
-
return (reg & priv->data->reset_status_bits) == priv->data->reset_status_bits;
}
@@ -141,6 +104,11 @@ static int rzv2h_usb2phy_reset_of_xlate(struct reset_controller_dev *rcdev,
return 0;
}
+static void rzv2h_usb2phy_reset_pm_runtime_put(void *data)
+{
+ pm_runtime_put(data);
+}
+
static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
{
const struct rzv2h_usb2phy_reset_of_data *data;
@@ -175,14 +143,14 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
if (error)
return dev_err_probe(dev, error, "pm_runtime_resume_and_get failed\n");
+ error = devm_add_action_or_reset(dev, rzv2h_usb2phy_reset_pm_runtime_put,
+ dev);
+ if (error)
+ return dev_err_probe(dev, error, "unable to register cleanup action\n");
+
for (unsigned int i = 0; i < data->init_val_count; i++)
writel(data->init_vals[i].val, priv->base + data->init_vals[i].reg);
- /* keep usb2phy in asserted state */
- rzv2h_usbphy_assert_helper(priv);
-
- pm_runtime_put(dev);
-
priv->rcdev.ops = &rzv2h_usbphy_reset_ops;
priv->rcdev.of_reset_n_cells = 0;
priv->rcdev.nr_resets = 1;
@@ -190,7 +158,11 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
priv->rcdev.of_node = dev->of_node;
priv->rcdev.dev = dev;
- return devm_reset_controller_register(dev, &priv->rcdev);
+ error = devm_reset_controller_register(dev, &priv->rcdev);
+ if (error)
+ return dev_err_probe(dev, error, "could not register reset controller\n");
+
+ return 0;
}
/*
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
` (3 preceding siblings ...)
2026-03-27 18:08 ` [PATCH v9 4/6] reset: rzv2h-usb2phy: Keep PHY clock enabled for entire device lifetime Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-31 16:36 ` Philipp Zabel
2026-03-27 18:08 ` [PATCH v9 6/6] reset: rzv2h-usb2phy: Add support for VBUS mux controller registration Tommaso Merciai
2026-03-31 16:16 ` [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Ulf Hansson
6 siblings, 1 reply; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel
Replace raw MMIO accesses (void __iomem *, readl/writel) with
regmap_read/regmap_write via devm_regmap_init_mmio(). Regmap
provides its own internal locking, so the manual spinlock and
scoped_guard() wrappers are no longer needed.
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- New patch
drivers/reset/Kconfig | 1 +
drivers/reset/reset-rzv2h-usb2phy.c | 42 ++++++++++++++++-------------
2 files changed, 24 insertions(+), 19 deletions(-)
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index 5165006be693..c539ca88518f 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
config RESET_RZV2H_USB2PHY
tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
depends on ARCH_RENESAS || COMPILE_TEST
+ select REGMAP_MMIO
help
Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
(and similar SoCs).
diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
index 5bdd39274612..4014eff0f017 100644
--- a/drivers/reset/reset-rzv2h-usb2phy.c
+++ b/drivers/reset/reset-rzv2h-usb2phy.c
@@ -5,13 +5,13 @@
* Copyright (C) 2025 Renesas Electronics Corporation
*/
-#include <linux/cleanup.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
#include <linux/reset.h>
#include <linux/reset-controller.h>
@@ -37,10 +37,9 @@ struct rzv2h_usb2phy_reset_of_data {
struct rzv2h_usb2phy_reset_priv {
const struct rzv2h_usb2phy_reset_of_data *data;
- void __iomem *base;
+ struct regmap *regmap;
struct device *dev;
struct reset_controller_dev rcdev;
- spinlock_t lock; /* protects register accesses */
};
static inline struct rzv2h_usb2phy_reset_priv
@@ -55,10 +54,8 @@ static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
- scoped_guard(spinlock, &priv->lock) {
- writel(data->reset2_acquire_val, priv->base + data->reset2_reg);
- writel(data->reset_assert_val, priv->base + data->reset_reg);
- }
+ regmap_write(priv->regmap, data->reset2_reg, data->reset2_acquire_val);
+ regmap_write(priv->regmap, data->reset_reg, data->reset_assert_val);
usleep_range(11, 20);
@@ -71,11 +68,9 @@ static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
- scoped_guard(spinlock, &priv->lock) {
- writel(data->reset_deassert_val, priv->base + data->reset_reg);
- writel(data->reset2_release_val, priv->base + data->reset2_reg);
- writel(data->reset_release_val, priv->base + data->reset_reg);
- }
+ regmap_write(priv->regmap, data->reset_reg, data->reset_deassert_val);
+ regmap_write(priv->regmap, data->reset2_reg, data->reset2_release_val);
+ regmap_write(priv->regmap, data->reset_reg, data->reset_release_val);
return 0;
}
@@ -86,7 +81,7 @@ static int rzv2h_usbphy_reset_status(struct reset_controller_dev *rcdev,
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
u32 reg;
- reg = readl(priv->base + priv->data->reset_reg);
+ regmap_read(priv->regmap, priv->data->reset_reg, ®);
return (reg & priv->data->reset_status_bits) == priv->data->reset_status_bits;
}
@@ -104,6 +99,12 @@ static int rzv2h_usb2phy_reset_of_xlate(struct reset_controller_dev *rcdev,
return 0;
}
+static const struct regmap_config rzv2h_usb2phy_reset_regconf = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
static void rzv2h_usb2phy_reset_pm_runtime_put(void *data)
{
pm_runtime_put(data);
@@ -115,6 +116,7 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
struct rzv2h_usb2phy_reset_priv *priv;
struct device *dev = &pdev->dev;
struct reset_control *rstc;
+ void __iomem *base;
int error;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -124,17 +126,19 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
data = of_device_get_match_data(dev);
priv->data = data;
priv->dev = dev;
- priv->base = devm_platform_ioremap_resource(pdev, 0);
- if (IS_ERR(priv->base))
- return PTR_ERR(priv->base);
+ base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(base))
+ return PTR_ERR(base);
+
+ priv->regmap = devm_regmap_init_mmio(dev, base, &rzv2h_usb2phy_reset_regconf);
+ if (IS_ERR(priv->regmap))
+ return PTR_ERR(priv->regmap);
rstc = devm_reset_control_get_shared_deasserted(dev, NULL);
if (IS_ERR(rstc))
return dev_err_probe(dev, PTR_ERR(rstc),
"failed to get deasserted reset\n");
- spin_lock_init(&priv->lock);
-
error = devm_pm_runtime_enable(dev);
if (error)
return dev_err_probe(dev, error, "Failed to enable pm_runtime\n");
@@ -149,7 +153,7 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
return dev_err_probe(dev, error, "unable to register cleanup action\n");
for (unsigned int i = 0; i < data->init_val_count; i++)
- writel(data->init_vals[i].val, priv->base + data->init_vals[i].reg);
+ regmap_write(priv->regmap, data->init_vals[i].reg, data->init_vals[i].val);
priv->rcdev.ops = &rzv2h_usbphy_reset_ops;
priv->rcdev.of_reset_n_cells = 0;
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-03-27 18:08 ` [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API Tommaso Merciai
@ 2026-03-31 16:36 ` Philipp Zabel
2026-04-01 8:04 ` Tommaso Merciai
0 siblings, 1 reply; 14+ messages in thread
From: Philipp Zabel @ 2026-03-31 16:36 UTC (permalink / raw)
To: Tommaso Merciai, tomm.merciai, peda
Cc: linux-renesas-soc, biju.das.jz, Fabrizio Castro, Lad Prabhakar,
Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel
On Fr, 2026-03-27 at 19:08 +0100, Tommaso Merciai wrote:
> Replace raw MMIO accesses (void __iomem *, readl/writel) with
> regmap_read/regmap_write via devm_regmap_init_mmio(). Regmap
> provides its own internal locking, so the manual spinlock and
> scoped_guard() wrappers are no longer needed.
>
> Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> ---
> v8->v9:
> - New patch
>
> drivers/reset/Kconfig | 1 +
> drivers/reset/reset-rzv2h-usb2phy.c | 42 ++++++++++++++++-------------
> 2 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> index 5165006be693..c539ca88518f 100644
> --- a/drivers/reset/Kconfig
> +++ b/drivers/reset/Kconfig
> @@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
> config RESET_RZV2H_USB2PHY
> tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
> depends on ARCH_RENESAS || COMPILE_TEST
> + select REGMAP_MMIO
> help
> Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
> (and similar SoCs).
> diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
> index 5bdd39274612..4014eff0f017 100644
> --- a/drivers/reset/reset-rzv2h-usb2phy.c
> +++ b/drivers/reset/reset-rzv2h-usb2phy.c
> @@ -5,13 +5,13 @@
> * Copyright (C) 2025 Renesas Electronics Corporation
> */
>
> -#include <linux/cleanup.h>
> #include <linux/delay.h>
> #include <linux/io.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/platform_device.h>
> #include <linux/pm_runtime.h>
> +#include <linux/regmap.h>
> #include <linux/reset.h>
> #include <linux/reset-controller.h>
>
> @@ -37,10 +37,9 @@ struct rzv2h_usb2phy_reset_of_data {
>
> struct rzv2h_usb2phy_reset_priv {
> const struct rzv2h_usb2phy_reset_of_data *data;
> - void __iomem *base;
> + struct regmap *regmap;
> struct device *dev;
> struct reset_controller_dev rcdev;
> - spinlock_t lock; /* protects register accesses */
> };
>
> static inline struct rzv2h_usb2phy_reset_priv
> @@ -55,10 +54,8 @@ static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
>
> - scoped_guard(spinlock, &priv->lock) {
> - writel(data->reset2_acquire_val, priv->base + data->reset2_reg);
> - writel(data->reset_assert_val, priv->base + data->reset_reg);
> - }
> + regmap_write(priv->regmap, data->reset2_reg, data->reset2_acquire_val);
> + regmap_write(priv->regmap, data->reset_reg, data->reset_assert_val);
What is the spinlock protecting? acquire/assert registers being set
together, without another acquire/assert or deassert/release register
access pair interleaving?
In that case you still need the lock. Or use regmap_multi_reg_write().
You could even directly store the sequences as struct reg_sequence in
rzv2h_usb2phy_reset_of_data.
> usleep_range(11, 20);
>
> @@ -71,11 +68,9 @@ static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
> struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
>
> - scoped_guard(spinlock, &priv->lock) {
> - writel(data->reset_deassert_val, priv->base + data->reset_reg);
> - writel(data->reset2_release_val, priv->base + data->reset2_reg);
> - writel(data->reset_release_val, priv->base + data->reset_reg);
> - }
> + regmap_write(priv->regmap, data->reset_reg, data->reset_deassert_val);
> + regmap_write(priv->regmap, data->reset2_reg, data->reset2_release_val);
> + regmap_write(priv->regmap, data->reset_reg, data->reset_release_val);
Same as above.
[...]
> @@ -149,7 +153,7 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
> return dev_err_probe(dev, error, "unable to register cleanup action\n");
>
> for (unsigned int i = 0; i < data->init_val_count; i++)
> - writel(data->init_vals[i].val, priv->base + data->init_vals[i].reg);
> + regmap_write(priv->regmap, data->init_vals[i].reg, data->init_vals[i].val);
Not required for locking, but this could use regmap_multi_reg_write()
as well.
regards
Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-03-31 16:36 ` Philipp Zabel
@ 2026-04-01 8:04 ` Tommaso Merciai
2026-04-01 8:23 ` Philipp Zabel
0 siblings, 1 reply; 14+ messages in thread
From: Tommaso Merciai @ 2026-04-01 8:04 UTC (permalink / raw)
To: Philipp Zabel
Cc: tomm.merciai, peda, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, Ulf Hansson, devicetree, linux-kernel
Hi Philipp,
Thanks for your review.
On Tue, Mar 31, 2026 at 06:36:45PM +0200, Philipp Zabel wrote:
> On Fr, 2026-03-27 at 19:08 +0100, Tommaso Merciai wrote:
> > Replace raw MMIO accesses (void __iomem *, readl/writel) with
> > regmap_read/regmap_write via devm_regmap_init_mmio(). Regmap
> > provides its own internal locking, so the manual spinlock and
> > scoped_guard() wrappers are no longer needed.
> >
> > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> > ---
> > v8->v9:
> > - New patch
> >
> > drivers/reset/Kconfig | 1 +
> > drivers/reset/reset-rzv2h-usb2phy.c | 42 ++++++++++++++++-------------
> > 2 files changed, 24 insertions(+), 19 deletions(-)
> >
> > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> > index 5165006be693..c539ca88518f 100644
> > --- a/drivers/reset/Kconfig
> > +++ b/drivers/reset/Kconfig
> > @@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
> > config RESET_RZV2H_USB2PHY
> > tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
> > depends on ARCH_RENESAS || COMPILE_TEST
> > + select REGMAP_MMIO
> > help
> > Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
> > (and similar SoCs).
> > diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
> > index 5bdd39274612..4014eff0f017 100644
> > --- a/drivers/reset/reset-rzv2h-usb2phy.c
> > +++ b/drivers/reset/reset-rzv2h-usb2phy.c
> > @@ -5,13 +5,13 @@
> > * Copyright (C) 2025 Renesas Electronics Corporation
> > */
> >
> > -#include <linux/cleanup.h>
> > #include <linux/delay.h>
> > #include <linux/io.h>
> > #include <linux/module.h>
> > #include <linux/of.h>
> > #include <linux/platform_device.h>
> > #include <linux/pm_runtime.h>
> > +#include <linux/regmap.h>
> > #include <linux/reset.h>
> > #include <linux/reset-controller.h>
> >
> > @@ -37,10 +37,9 @@ struct rzv2h_usb2phy_reset_of_data {
> >
> > struct rzv2h_usb2phy_reset_priv {
> > const struct rzv2h_usb2phy_reset_of_data *data;
> > - void __iomem *base;
> > + struct regmap *regmap;
> > struct device *dev;
> > struct reset_controller_dev rcdev;
> > - spinlock_t lock; /* protects register accesses */
> > };
> >
> > static inline struct rzv2h_usb2phy_reset_priv
> > @@ -55,10 +54,8 @@ static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> > struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> > const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> >
> > - scoped_guard(spinlock, &priv->lock) {
> > - writel(data->reset2_acquire_val, priv->base + data->reset2_reg);
> > - writel(data->reset_assert_val, priv->base + data->reset_reg);
> > - }
> > + regmap_write(priv->regmap, data->reset2_reg, data->reset2_acquire_val);
> > + regmap_write(priv->regmap, data->reset_reg, data->reset_assert_val);
>
> What is the spinlock protecting? acquire/assert registers being set
> together, without another acquire/assert or deassert/release register
> access pair interleaving?
> In that case you still need the lock. Or use regmap_multi_reg_write().
> You could even directly store the sequences as struct reg_sequence in
> rzv2h_usb2phy_reset_of_data.
You are correct. Thank you.
As per your suggestion I'm planning to use regmap_multi_reg_write().
Plan is to have the:
static const struct reg_sequence rzv2h_init_seqs[] = {
{ .reg = 0xc10, .def = 0x67c },
{ .reg = 0xc14, .def = 0x1f },
{ .reg = 0x600, .def = 0x909 },
};
static const struct reg_sequence rzv2h_assert_seqs[] = {
{ .reg = 0xb04, .def = 0x303 },
{ .reg = 0x000, .def = 0x206 },
};
static const struct reg_sequence rzv2h_deassert_seqs[] = {
{ .reg = 0x000, .def = 0x200 },
{ .reg = 0xb04, .def = 0x003 },
{ .reg = 0x000, .def = 0x000 },
};
static const struct rzv2h_usb2phy_reset_of_data rzv2h_reset_of_data = {
.init_seqs = rzv2h_init_seqs,
.init_nseqs = ARRAY_SIZE(rzv2h_init_seqs),
.assert_seqs = rzv2h_assert_seqs,
.assert_nseqs = ARRAY_SIZE(rzv2h_assert_seqs),
.deassert_seqs = rzv2h_deassert_seqs,
.deassert_nseqs = ARRAY_SIZE(rzv2h_deassert_seqs),
.reset_reg = 0,
.reset_status_bits = BIT(2),
};
With that I can use:
static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
int ret;
ret = regmap_multi_reg_write(priv->regmap, data->assert_seqs,
data->assert_nseqs);
if (ret)
return ret;
usleep_range(11, 20);
return 0;
}
static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
return regmap_multi_reg_write(priv->regmap, priv->data->deassert_seqs,
priv->data->deassert_nseqs);
}
>
> > usleep_range(11, 20);
> >
> > @@ -71,11 +68,9 @@ static int rzv2h_usbphy_reset_deassert(struct reset_controller_dev *rcdev,
> > struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> > const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> >
> > - scoped_guard(spinlock, &priv->lock) {
> > - writel(data->reset_deassert_val, priv->base + data->reset_reg);
> > - writel(data->reset2_release_val, priv->base + data->reset2_reg);
> > - writel(data->reset_release_val, priv->base + data->reset_reg);
> > - }
> > + regmap_write(priv->regmap, data->reset_reg, data->reset_deassert_val);
> > + regmap_write(priv->regmap, data->reset2_reg, data->reset2_release_val);
> > + regmap_write(priv->regmap, data->reset_reg, data->reset_release_val);
>
> Same as above.
return regmap_multi_reg_write(priv->regmap, priv->data->deassert_seqs,
priv->data->deassert_nseqs);
>
> [...]
>
> > @@ -149,7 +153,7 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
> > return dev_err_probe(dev, error, "unable to register cleanup action\n");
> >
> > for (unsigned int i = 0; i < data->init_val_count; i++)
> > - writel(data->init_vals[i].val, priv->base + data->init_vals[i].reg);
> > + regmap_write(priv->regmap, data->init_vals[i].reg, data->init_vals[i].val);
>
> Not required for locking, but this could use regmap_multi_reg_write()
> as well.
>
And here we can use:
error = regmap_multi_reg_write(priv->regmap, data->init_seqs, data->init_nseqs);
if (error)
return dev_err_probe(dev, error, "failed to initialize PHY registers\n");
Will send new version hope later today.
Thanks again for the hint!
Kind Regards,
Tommaso
> regards
> Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-04-01 8:04 ` Tommaso Merciai
@ 2026-04-01 8:23 ` Philipp Zabel
2026-04-01 9:10 ` Tommaso Merciai
0 siblings, 1 reply; 14+ messages in thread
From: Philipp Zabel @ 2026-04-01 8:23 UTC (permalink / raw)
To: Tommaso Merciai
Cc: tomm.merciai, peda, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, Ulf Hansson, devicetree, linux-kernel
On Mi, 2026-04-01 at 10:04 +0200, Tommaso Merciai wrote:
> Hi Philipp,
> Thanks for your review.
>
> On Tue, Mar 31, 2026 at 06:36:45PM +0200, Philipp Zabel wrote:
> > On Fr, 2026-03-27 at 19:08 +0100, Tommaso Merciai wrote:
> > > Replace raw MMIO accesses (void __iomem *, readl/writel) with
> > > regmap_read/regmap_write via devm_regmap_init_mmio(). Regmap
> > > provides its own internal locking, so the manual spinlock and
> > > scoped_guard() wrappers are no longer needed.
> > >
> > > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> > > ---
> > > v8->v9:
> > > - New patch
> > >
> > > drivers/reset/Kconfig | 1 +
> > > drivers/reset/reset-rzv2h-usb2phy.c | 42 ++++++++++++++++-------------
> > > 2 files changed, 24 insertions(+), 19 deletions(-)
> > >
> > > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> > > index 5165006be693..c539ca88518f 100644
> > > --- a/drivers/reset/Kconfig
> > > +++ b/drivers/reset/Kconfig
> > > @@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
> > > config RESET_RZV2H_USB2PHY
> > > tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
> > > depends on ARCH_RENESAS || COMPILE_TEST
> > > + select REGMAP_MMIO
> > > help
> > > Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
> > > (and similar SoCs).
> > > diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
> > > index 5bdd39274612..4014eff0f017 100644
> > > --- a/drivers/reset/reset-rzv2h-usb2phy.c
> > > +++ b/drivers/reset/reset-rzv2h-usb2phy.c
> > > @@ -5,13 +5,13 @@
> > > * Copyright (C) 2025 Renesas Electronics Corporation
> > > */
> > >
> > > -#include <linux/cleanup.h>
> > > #include <linux/delay.h>
> > > #include <linux/io.h>
> > > #include <linux/module.h>
> > > #include <linux/of.h>
> > > #include <linux/platform_device.h>
> > > #include <linux/pm_runtime.h>
> > > +#include <linux/regmap.h>
> > > #include <linux/reset.h>
> > > #include <linux/reset-controller.h>
> > >
> > > @@ -37,10 +37,9 @@ struct rzv2h_usb2phy_reset_of_data {
> > >
> > > struct rzv2h_usb2phy_reset_priv {
> > > const struct rzv2h_usb2phy_reset_of_data *data;
> > > - void __iomem *base;
> > > + struct regmap *regmap;
> > > struct device *dev;
> > > struct reset_controller_dev rcdev;
> > > - spinlock_t lock; /* protects register accesses */
> > > };
> > >
> > > static inline struct rzv2h_usb2phy_reset_priv
> > > @@ -55,10 +54,8 @@ static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> > > struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> > > const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> > >
> > > - scoped_guard(spinlock, &priv->lock) {
> > > - writel(data->reset2_acquire_val, priv->base + data->reset2_reg);
> > > - writel(data->reset_assert_val, priv->base + data->reset_reg);
> > > - }
> > > + regmap_write(priv->regmap, data->reset2_reg, data->reset2_acquire_val);
> > > + regmap_write(priv->regmap, data->reset_reg, data->reset_assert_val);
> >
> > What is the spinlock protecting? acquire/assert registers being set
> > together, without another acquire/assert or deassert/release register
> > access pair interleaving?
> > In that case you still need the lock. Or use regmap_multi_reg_write().
> > You could even directly store the sequences as struct reg_sequence in
> > rzv2h_usb2phy_reset_of_data.
>
> You are correct. Thank you.
> As per your suggestion I'm planning to use regmap_multi_reg_write().
>
> Plan is to have the:
>
> static const struct reg_sequence rzv2h_init_seqs[] = {
Even though the struct is called req_sequence, the whole array is the
sequence. Let's call these _seq, singular.
> { .reg = 0xc10, .def = 0x67c },
> { .reg = 0xc14, .def = 0x1f },
0x01f for consistency?
> { .reg = 0x600, .def = 0x909 },
> };
>
> static const struct reg_sequence rzv2h_assert_seqs[] = {
> { .reg = 0xb04, .def = 0x303 },
> { .reg = 0x000, .def = 0x206 },
Consider setting .delay_us = 11, see below.
> };
>
> static const struct reg_sequence rzv2h_deassert_seqs[] = {
> { .reg = 0x000, .def = 0x200 },
> { .reg = 0xb04, .def = 0x003 },
> { .reg = 0x000, .def = 0x000 },
> };
>
> static const struct rzv2h_usb2phy_reset_of_data rzv2h_reset_of_data = {
> .init_seqs = rzv2h_init_seqs,
> .init_nseqs = ARRAY_SIZE(rzv2h_init_seqs),
> .assert_seqs = rzv2h_assert_seqs,
> .assert_nseqs = ARRAY_SIZE(rzv2h_assert_seqs),
> .deassert_seqs = rzv2h_deassert_seqs,
> .deassert_nseqs = ARRAY_SIZE(rzv2h_deassert_seqs),
> .reset_reg = 0,
> .reset_status_bits = BIT(2),
> };
>
> With that I can use:
>
> static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> unsigned long id)
> {
> struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> int ret;
>
> ret = regmap_multi_reg_write(priv->regmap, data->assert_seqs,
> data->assert_nseqs);
> if (ret)
> return ret;
>
> usleep_range(11, 20);
Specifying a delay in rzv2h_assert_seqs[] and setting
rzv2h_usb2phy_reset_regconf.can_sleep = true would have the same
effect.
regards
Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-04-01 8:23 ` Philipp Zabel
@ 2026-04-01 9:10 ` Tommaso Merciai
2026-04-01 9:25 ` Philipp Zabel
0 siblings, 1 reply; 14+ messages in thread
From: Tommaso Merciai @ 2026-04-01 9:10 UTC (permalink / raw)
To: Philipp Zabel
Cc: tomm.merciai, peda, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, Ulf Hansson, devicetree, linux-kernel
Hi Philipp,
Thanks for your comments.
On Wed, Apr 01, 2026 at 10:23:51AM +0200, Philipp Zabel wrote:
> On Mi, 2026-04-01 at 10:04 +0200, Tommaso Merciai wrote:
> > Hi Philipp,
> > Thanks for your review.
> >
> > On Tue, Mar 31, 2026 at 06:36:45PM +0200, Philipp Zabel wrote:
> > > On Fr, 2026-03-27 at 19:08 +0100, Tommaso Merciai wrote:
> > > > Replace raw MMIO accesses (void __iomem *, readl/writel) with
> > > > regmap_read/regmap_write via devm_regmap_init_mmio(). Regmap
> > > > provides its own internal locking, so the manual spinlock and
> > > > scoped_guard() wrappers are no longer needed.
> > > >
> > > > Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
> > > > ---
> > > > v8->v9:
> > > > - New patch
> > > >
> > > > drivers/reset/Kconfig | 1 +
> > > > drivers/reset/reset-rzv2h-usb2phy.c | 42 ++++++++++++++++-------------
> > > > 2 files changed, 24 insertions(+), 19 deletions(-)
> > > >
> > > > diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
> > > > index 5165006be693..c539ca88518f 100644
> > > > --- a/drivers/reset/Kconfig
> > > > +++ b/drivers/reset/Kconfig
> > > > @@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
> > > > config RESET_RZV2H_USB2PHY
> > > > tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
> > > > depends on ARCH_RENESAS || COMPILE_TEST
> > > > + select REGMAP_MMIO
> > > > help
> > > > Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
> > > > (and similar SoCs).
> > > > diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
> > > > index 5bdd39274612..4014eff0f017 100644
> > > > --- a/drivers/reset/reset-rzv2h-usb2phy.c
> > > > +++ b/drivers/reset/reset-rzv2h-usb2phy.c
> > > > @@ -5,13 +5,13 @@
> > > > * Copyright (C) 2025 Renesas Electronics Corporation
> > > > */
> > > >
> > > > -#include <linux/cleanup.h>
> > > > #include <linux/delay.h>
> > > > #include <linux/io.h>
> > > > #include <linux/module.h>
> > > > #include <linux/of.h>
> > > > #include <linux/platform_device.h>
> > > > #include <linux/pm_runtime.h>
> > > > +#include <linux/regmap.h>
> > > > #include <linux/reset.h>
> > > > #include <linux/reset-controller.h>
> > > >
> > > > @@ -37,10 +37,9 @@ struct rzv2h_usb2phy_reset_of_data {
> > > >
> > > > struct rzv2h_usb2phy_reset_priv {
> > > > const struct rzv2h_usb2phy_reset_of_data *data;
> > > > - void __iomem *base;
> > > > + struct regmap *regmap;
> > > > struct device *dev;
> > > > struct reset_controller_dev rcdev;
> > > > - spinlock_t lock; /* protects register accesses */
> > > > };
> > > >
> > > > static inline struct rzv2h_usb2phy_reset_priv
> > > > @@ -55,10 +54,8 @@ static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> > > > struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> > > > const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> > > >
> > > > - scoped_guard(spinlock, &priv->lock) {
> > > > - writel(data->reset2_acquire_val, priv->base + data->reset2_reg);
> > > > - writel(data->reset_assert_val, priv->base + data->reset_reg);
> > > > - }
> > > > + regmap_write(priv->regmap, data->reset2_reg, data->reset2_acquire_val);
> > > > + regmap_write(priv->regmap, data->reset_reg, data->reset_assert_val);
> > >
> > > What is the spinlock protecting? acquire/assert registers being set
> > > together, without another acquire/assert or deassert/release register
> > > access pair interleaving?
> > > In that case you still need the lock. Or use regmap_multi_reg_write().
> > > You could even directly store the sequences as struct reg_sequence in
> > > rzv2h_usb2phy_reset_of_data.
> >
> > You are correct. Thank you.
> > As per your suggestion I'm planning to use regmap_multi_reg_write().
> >
> > Plan is to have the:
> >
> > static const struct reg_sequence rzv2h_init_seqs[] = {
>
> Even though the struct is called req_sequence, the whole array is the
> sequence. Let's call these _seq, singular.
Ack.
>
> > { .reg = 0xc10, .def = 0x67c },
> > { .reg = 0xc14, .def = 0x1f },
>
> 0x01f for consistency?
Ouch, thank you!
>
> > { .reg = 0x600, .def = 0x909 },
> > };
> >
> > static const struct reg_sequence rzv2h_assert_seqs[] = {
> > { .reg = 0xb04, .def = 0x303 },
> > { .reg = 0x000, .def = 0x206 },
>
> Consider setting .delay_us = 11, see below.
Thanks for the hint.
>
> > };
> >
> > static const struct reg_sequence rzv2h_deassert_seqs[] = {
> > { .reg = 0x000, .def = 0x200 },
> > { .reg = 0xb04, .def = 0x003 },
> > { .reg = 0x000, .def = 0x000 },
> > };
> >
> > static const struct rzv2h_usb2phy_reset_of_data rzv2h_reset_of_data = {
> > .init_seqs = rzv2h_init_seqs,
> > .init_nseqs = ARRAY_SIZE(rzv2h_init_seqs),
> > .assert_seqs = rzv2h_assert_seqs,
> > .assert_nseqs = ARRAY_SIZE(rzv2h_assert_seqs),
> > .deassert_seqs = rzv2h_deassert_seqs,
> > .deassert_nseqs = ARRAY_SIZE(rzv2h_deassert_seqs),
> > .reset_reg = 0,
> > .reset_status_bits = BIT(2),
> > };
> >
> > With that I can use:
> >
> > static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
> > unsigned long id)
> > {
> > struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
> > const struct rzv2h_usb2phy_reset_of_data *data = priv->data;
> > int ret;
> >
> > ret = regmap_multi_reg_write(priv->regmap, data->assert_seqs,
> > data->assert_nseqs);
> > if (ret)
> > return ret;
> >
> > usleep_range(11, 20);
>
> Specifying a delay in rzv2h_assert_seqs[] and setting
> rzv2h_usb2phy_reset_regconf.can_sleep = true would have the same
> effect.
Then we can have:
static const struct reg_sequence rzv2h_init_seq[] = {
{ .reg = 0xc10, .def = 0x67c },
{ .reg = 0xc14, .def = 0x01f },
{ .reg = 0x600, .def = 0x909 },
};
static const struct reg_sequence rzv2h_assert_seq[] = {
{ .reg = 0xb04, .def = 0x303 },
{ .reg = 0x000, .def = 0x206, .delay_us = 20 },
};
static const struct reg_sequence rzv2h_deassert_seq[] = {
{ .reg = 0x000, .def = 0x200 },
{ .reg = 0xb04, .def = 0x003 },
{ .reg = 0x000, .def = 0x000 },
};
static const struct rzv2h_usb2phy_reset_of_data rzv2h_reset_of_data = {
.init_seq = rzv2h_init_seq,
.init_nseq = ARRAY_SIZE(rzv2h_init_seq),
.assert_seq = rzv2h_assert_seq,
.assert_nseq = ARRAY_SIZE(rzv2h_assert_seq),
.deassert_seq = rzv2h_deassert_seq,
.deassert_nseq = ARRAY_SIZE(rzv2h_deassert_seq),
.reset_reg = 0,
.reset_status_bits = BIT(2),
};
And I'll add:
static const struct regmap_config rzv2h_usb2phy_reset_regconf = {
.reg_bits = 32,
.val_bits = 32,
.reg_stride = 4,
.can_sleep = true,
};
In this way as you suggested we can drop usleep_range() into
rzv2h_usbphy_reset_assert() in thi way I think we can have
simply:
static int rzv2h_usbphy_reset_assert(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct rzv2h_usb2phy_reset_priv *priv = rzv2h_usbphy_rcdev_to_priv(rcdev);
return regmap_multi_reg_write(priv->regmap, priv->data->assert_seq,
priv->data->assert_nseq);
}
What do you think? Thanks.
Kind Regards,
Tommaso
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-04-01 9:10 ` Tommaso Merciai
@ 2026-04-01 9:25 ` Philipp Zabel
2026-04-01 10:25 ` Tommaso Merciai
0 siblings, 1 reply; 14+ messages in thread
From: Philipp Zabel @ 2026-04-01 9:25 UTC (permalink / raw)
To: Tommaso Merciai
Cc: tomm.merciai, peda, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, Ulf Hansson, devicetree, linux-kernel
On Mi, 2026-04-01 at 11:10 +0200, Tommaso Merciai wrote:
[...]
>
> Then we can have:
>
> static const struct reg_sequence rzv2h_init_seq[] = {
> { .reg = 0xc10, .def = 0x67c },
> { .reg = 0xc14, .def = 0x01f },
> { .reg = 0x600, .def = 0x909 },
> };
>
> static const struct reg_sequence rzv2h_assert_seq[] = {
> { .reg = 0xb04, .def = 0x303 },
> { .reg = 0x000, .def = 0x206, .delay_us = 20 },
This will call fsleep(20), which maps to usleep_range(20, 25).
Please comment on why the delay is changed in the commit message.
regards
Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API
2026-04-01 9:25 ` Philipp Zabel
@ 2026-04-01 10:25 ` Tommaso Merciai
0 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-04-01 10:25 UTC (permalink / raw)
To: Philipp Zabel
Cc: tomm.merciai, peda, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, Ulf Hansson, devicetree, linux-kernel
Hi Philipp,
Thanks for your comments.
On Wed, Apr 01, 2026 at 11:25:52AM +0200, Philipp Zabel wrote:
> On Mi, 2026-04-01 at 11:10 +0200, Tommaso Merciai wrote:
> [...]
> >
> > Then we can have:
> >
> > static const struct reg_sequence rzv2h_init_seq[] = {
> > { .reg = 0xc10, .def = 0x67c },
> > { .reg = 0xc14, .def = 0x01f },
> > { .reg = 0x600, .def = 0x909 },
> > };
> >
> > static const struct reg_sequence rzv2h_assert_seq[] = {
> > { .reg = 0xb04, .def = 0x303 },
> > { .reg = 0x000, .def = 0x206, .delay_us = 20 },
>
> This will call fsleep(20), which maps to usleep_range(20, 25).
> Please comment on why the delay is changed in the commit message.
Ouch, thanks.
Reference Manual says:
- This reset must be asserted for more than 10us.
Then I think the right choiche would be:
.delay_us = 11
This will call fsleep(11) which maps usleep_range(11, 13)
Please correct me if I'm wrong.
Thanks,
Tommaso
>
> regards
> Philipp
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v9 6/6] reset: rzv2h-usb2phy: Add support for VBUS mux controller registration
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
` (4 preceding siblings ...)
2026-03-27 18:08 ` [PATCH v9 5/6] reset: rzv2h-usb2phy: Convert to regmap API Tommaso Merciai
@ 2026-03-27 18:08 ` Tommaso Merciai
2026-03-31 16:16 ` [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Ulf Hansson
6 siblings, 0 replies; 14+ messages in thread
From: Tommaso Merciai @ 2026-03-27 18:08 UTC (permalink / raw)
To: tomm.merciai, peda, p.zabel
Cc: linux-renesas-soc, biju.das.jz, Tommaso Merciai, Fabrizio Castro,
Lad Prabhakar, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman, Josua Mayer,
Ulf Hansson, devicetree, linux-kernel
The RZ/V2H USB2 PHY requires control of the VBUS selection line
(VBENCTL) through a mux controller described in the device tree as
"mux-controller". This change adds support for registering the
rzv2h-usb-vbenctl auxiliary driver during probe.
This enables proper management of USB2.0 VBUS source selection on
platforms using the RZ/V2H SoC.
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@bp.renesas.com>
---
v8->v9:
- Drop linux/reset/reset_rzv2h_usb2phy.h dependecy as the driver
is now based on regmap and does not need the reset driver's
private header, update driver accordingly.
- Collected PZabel tag.
v7->v8:
- No changes
v6->v7:
- No changes
v5->v6:
- No changes
v4->v5:
- Update mux_name to "vbenctl" to match the driver name.
- Updated commit message.
v3->v4:
- No changes.
v2->v3:
- Use __devm_auxiliary_device_create() to create the auxiliary device.
v1->v2:
- New patch
drivers/reset/Kconfig | 1 +
drivers/reset/reset-rzv2h-usb2phy.c | 35 +++++++++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index c539ca88518f..62b2c3919613 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -257,6 +257,7 @@ config RESET_RZG2L_USBPHY_CTRL
config RESET_RZV2H_USB2PHY
tristate "Renesas RZ/V2H(P) (and similar SoCs) USB2PHY Reset driver"
depends on ARCH_RENESAS || COMPILE_TEST
+ select AUXILIARY_BUS
select REGMAP_MMIO
help
Support for USB2PHY Port reset Control found on the RZ/V2H(P) SoC
diff --git a/drivers/reset/reset-rzv2h-usb2phy.c b/drivers/reset/reset-rzv2h-usb2phy.c
index 4014eff0f017..b1b8fa8377dd 100644
--- a/drivers/reset/reset-rzv2h-usb2phy.c
+++ b/drivers/reset/reset-rzv2h-usb2phy.c
@@ -5,7 +5,9 @@
* Copyright (C) 2025 Renesas Electronics Corporation
*/
+#include <linux/auxiliary_bus.h>
#include <linux/delay.h>
+#include <linux/idr.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of.h>
@@ -15,6 +17,8 @@
#include <linux/reset.h>
#include <linux/reset-controller.h>
+static DEFINE_IDA(auxiliary_ids);
+
struct rzv2h_usb2phy_regval {
u16 reg;
u16 val;
@@ -99,6 +103,33 @@ static int rzv2h_usb2phy_reset_of_xlate(struct reset_controller_dev *rcdev,
return 0;
}
+static void rzv2h_usb2phy_reset_ida_free(void *data)
+{
+ struct auxiliary_device *adev = data;
+
+ ida_free(&auxiliary_ids, adev->id);
+}
+
+static int rzv2h_usb2phy_reset_mux_register(struct device *dev,
+ const char *mux_name)
+{
+ struct auxiliary_device *adev;
+ int id;
+
+ id = ida_alloc(&auxiliary_ids, GFP_KERNEL);
+ if (id < 0)
+ return id;
+
+ adev = __devm_auxiliary_device_create(dev, dev->driver->name,
+ mux_name, NULL, id);
+ if (!adev) {
+ ida_free(&auxiliary_ids, id);
+ return -ENOMEM;
+ }
+
+ return devm_add_action_or_reset(dev, rzv2h_usb2phy_reset_ida_free, adev);
+}
+
static const struct regmap_config rzv2h_usb2phy_reset_regconf = {
.reg_bits = 32,
.val_bits = 32,
@@ -166,6 +197,10 @@ static int rzv2h_usb2phy_reset_probe(struct platform_device *pdev)
if (error)
return dev_err_probe(dev, error, "could not register reset controller\n");
+ error = rzv2h_usb2phy_reset_mux_register(dev, "vbenctl");
+ if (error)
+ return dev_err_probe(dev, error, "could not register aux mux\n");
+
return 0;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support
2026-03-27 18:08 [PATCH v9 0/6] Add USB2.0 VBUS mux driver and extend rzv2h-usb2phy reset for RZ/G3E support Tommaso Merciai
` (5 preceding siblings ...)
2026-03-27 18:08 ` [PATCH v9 6/6] reset: rzv2h-usb2phy: Add support for VBUS mux controller registration Tommaso Merciai
@ 2026-03-31 16:16 ` Ulf Hansson
6 siblings, 0 replies; 14+ messages in thread
From: Ulf Hansson @ 2026-03-31 16:16 UTC (permalink / raw)
To: Tommaso Merciai
Cc: tomm.merciai, peda, p.zabel, linux-renesas-soc, biju.das.jz,
Fabrizio Castro, Lad Prabhakar, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Geert Uytterhoeven, Magnus Damm, Greg Kroah-Hartman,
Josua Mayer, devicetree, linux-kernel
On Fri, 27 Mar 2026 at 19:09, Tommaso Merciai
<tommaso.merciai.xr@bp.renesas.com> wrote:
>
> Dear All,
>
> The series adds:
> - A new mux driver for RZ/V2H USB VBENCTL VBUS_SEL
> - Updates to the rzv2h-usb2phy reset driver/bindings to support RZ/G3E.
>
> Merge strategy, if any:
>
> - patches 1/6 can go through the MUX tree
I have quite some MUX changes queued via my mmc tree for v7.1-rc1.
I can pick patch1/6 as well, if this makes sense for everybody. Peter?
> - patches 2-6/6 can go through the Reset tree
>
> Thanks & Regards,
> Tommaso
>
[...]
Kind regards
Uffe
^ permalink raw reply [flat|nested] 14+ messages in thread