[PATCH 2/2] mux: rzv2h-vbenctl: Add suspend and resume support
From: Tommaso Merciai
Date: Thu Oct 08 2026 - 04:02:07 EST
On deep sleep the USB2PHY block loses power and the VBUS_SEL bit is
cleared. The mux state is read during suspend and stored in the private
memory of the mux_chip. Then the state is restored during resume.
Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@xxxxxxxxxxxxxx>
---
drivers/mux/rzv2h-vbenctl.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/mux/rzv2h-vbenctl.c b/drivers/mux/rzv2h-vbenctl.c
index 2699458045f3..d088ac3cab2a 100644
--- a/drivers/mux/rzv2h-vbenctl.c
+++ b/drivers/mux/rzv2h-vbenctl.c
@@ -15,6 +15,7 @@
struct mux_rzv2h_vbenctl_priv {
struct regmap_field *field;
+ unsigned int hardware_state;
};
static int mux_rzv2h_vbenctl_set(struct mux_control *mux, int state)
@@ -60,9 +61,29 @@ static int mux_rzv2h_vbenctl_probe(struct auxiliary_device *adev,
if (ret < 0)
return dev_err_probe(dev, ret, "Failed to register mux chip\n");
+ auxiliary_set_drvdata(adev, priv);
+
return 0;
}
+static int mux_rzv2h_vbenctl_suspend(struct device *dev)
+{
+ struct mux_rzv2h_vbenctl_priv *priv = dev_get_drvdata(dev);
+
+ return regmap_field_read(priv->field, &priv->hardware_state);
+}
+
+static int mux_rzv2h_vbenctl_resume(struct device *dev)
+{
+ struct mux_rzv2h_vbenctl_priv *priv = dev_get_drvdata(dev);
+
+ return regmap_field_write(priv->field, priv->hardware_state);
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(mux_rzv2h_vbenctl_pm_ops,
+ mux_rzv2h_vbenctl_suspend,
+ mux_rzv2h_vbenctl_resume);
+
static const struct auxiliary_device_id mux_rzv2h_vbenctl_ids[] = {
{ .name = "rzv2h_usb2phy_reset.vbenctl" },
{ /* sentinel */ }
@@ -73,6 +94,9 @@ static struct auxiliary_driver mux_rzv2h_vbenctl_driver = {
.name = "vbenctl",
.probe = mux_rzv2h_vbenctl_probe,
.id_table = mux_rzv2h_vbenctl_ids,
+ .driver = {
+ .pm = pm_sleep_ptr(&mux_rzv2h_vbenctl_pm_ops),
+ },
};
module_auxiliary_driver(mux_rzv2h_vbenctl_driver);
--
2.54.0