[PATCH v4 2/2] ufs: qcom: add ufs host regulator support
Federico Amedeo Izzo via B4 Relay
devnull+federico.izzo.pro at kernel.org
Sat May 23 15:04:25 CEST 2026
From: Federico Amedeo Izzo <federico at izzo.pro>
The qcom UFS driver works without touching the regulators on most platforms
as ABL leaves them already configured and enabled.
On some SC7280 phones with UFS 3.1 like nothing-spacewar, vcc regulator is
not enabled by ABL, so we need to configure and enable it to use the UFS
storage.
Tested on nothing-spacewar and motorola-dubai using Tauchgang U-Boot.
Signed-off-by: Federico Amedeo Izzo <federico at izzo.pro>
---
drivers/ufs/ufs-qcom.c | 25 +++++++++++++++++++++++++
drivers/ufs/ufs-qcom.h | 4 ++++
2 files changed, 29 insertions(+)
diff --git a/drivers/ufs/ufs-qcom.c b/drivers/ufs/ufs-qcom.c
index dc40ee62daf..0e2e45f1075 100644
--- a/drivers/ufs/ufs-qcom.c
+++ b/drivers/ufs/ufs-qcom.c
@@ -16,6 +16,7 @@
#include <generic-phy.h>
#include <asm/gpio.h>
#include <interconnect.h>
+#include <power/regulator.h>
#include <linux/bitops.h>
#include <linux/delay.h>
@@ -561,6 +562,19 @@ static int ufs_qcom_init(struct ufs_hba *hba)
priv->hba = hba;
+ /* enable regulators */
+ err = regulator_set_enable(priv->vcc, true);
+ if (err && err != -ENOSYS)
+ dev_warn(hba->dev, "failed to enable regulator vcc-supply:%d\n", err);
+
+ err = regulator_set_enable(priv->vccq, true);
+ if (err && err != -ENOSYS)
+ dev_warn(hba->dev, "failed to enable regulator vccq-supply:%d\n", err);
+
+ err = regulator_set_enable(priv->vccq2, true);
+ if (err && err != -ENOSYS)
+ dev_warn(hba->dev, "failed to enable regulator vccq2-supply:%d\n", err);
+
/* setup clocks */
ufs_qcom_setup_clocks(hba, true, PRE_CHANGE);
@@ -651,6 +665,17 @@ static int ufs_qcom_probe(struct udevice *dev)
dev_err(dev, "Warning: cannot get reset GPIO\n");
}
+ ret = device_get_supply_regulator(dev, "vcc-supply", &priv->vcc);
+ if (ret)
+ dev_warn(dev, "failed to get regulator vcc-supply:%d\n", ret);
+
+ ret = device_get_supply_regulator(dev, "vccq-supply", &priv->vccq);
+ if (ret)
+ dev_warn(dev, "failed to get regulator vccq-supply:%d\n", ret);
+
+ /* vccq2 is optional on UFS2 and missing on UFS3 and later */
+ device_get_supply_regulator(dev, "vccq2-supply", &priv->vccq2);
+
ret = ufshcd_probe(dev, &ufs_qcom_hba_ops);
if (ret) {
dev_err(dev, "ufshcd_probe() failed, ret:%d\n", ret);
diff --git a/drivers/ufs/ufs-qcom.h b/drivers/ufs/ufs-qcom.h
index de957ae60f3..115565db7e9 100644
--- a/drivers/ufs/ufs-qcom.h
+++ b/drivers/ufs/ufs-qcom.h
@@ -134,6 +134,10 @@ struct ufs_qcom_priv {
struct clk_bulk clks;
bool is_clks_enabled;
+ struct udevice *vcc;
+ struct udevice *vccq;
+ struct udevice *vccq2;
+
struct ufs_hw_version hw_ver;
/* Reset control of HCI */
--
2.54.0
More information about the U-Boot
mailing list