[PATCH v11 08/24] scsi: ufs: mediatek: Add dual 0.9V supply support
Louis-Alexis Eyraud
louisalexis.eyraud at collabora.com
Tue Sep 1 08:38:56 PDT 2026
The MT8196 SoC has an additional pin in comparison of the MT8183 SoC,
that is used to feed the host controller with a 0.9V supply.
In preparation of this SoC support, add in platform data and
driver the management a second optional 0.9V regulator named
"avdd09-1".
Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud at collabora.com>
---
drivers/ufs/host/ufs-mediatek.c | 82 ++++++++++++++++++++++++++++++-----------
drivers/ufs/host/ufs-mediatek.h | 1 +
2 files changed, 61 insertions(+), 22 deletions(-)
diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
index eb7a0cc464f4..f298ea6f6ecb 100644
--- a/drivers/ufs/host/ufs-mediatek.c
+++ b/drivers/ufs/host/ufs-mediatek.c
@@ -41,6 +41,7 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up);
struct ufs_mtk_soc_data {
bool has_avdd09;
+ bool has_avdd09_1;
};
static const struct ufs_dev_quirk ufs_mtk_dev_fixups[] = {
@@ -515,16 +516,29 @@ static int ufs_mtk_09v_off(struct ufs_mtk_host *host)
struct arm_smccc_res res;
int ret;
- if (!host->reg_avdd09)
+ if (!host->reg_avdd09 && !host->reg_avdd09_1)
return 0;
ufs_mtk_va09_pwr_ctrl(res, 0);
- ret = regulator_disable(host->reg_avdd09);
- if (ret) {
- dev_err(host->hba->dev, "Failed to disable avdd09-supply: %pe\n",
- ERR_PTR(ret));
- ufs_mtk_va09_pwr_ctrl(res, 1);
- return ret;
+
+ if (host->reg_avdd09) {
+ ret = regulator_disable(host->reg_avdd09);
+ if (ret) {
+ dev_err(host->hba->dev, "Failed to disable avdd09-supply: %pe\n",
+ ERR_PTR(ret));
+ ufs_mtk_va09_pwr_ctrl(res, 1);
+ return ret;
+ }
+ }
+
+ if (host->reg_avdd09_1) {
+ ret = regulator_disable(host->reg_avdd09_1);
+ if (ret) {
+ dev_err(host->hba->dev, "Failed to disable avdd09-1-supply: %pe\n",
+ ERR_PTR(ret));
+ ufs_mtk_va09_pwr_ctrl(res, 1);
+ return ret;
+ }
}
return 0;
@@ -535,14 +549,25 @@ static int ufs_mtk_09v_on(struct ufs_mtk_host *host)
struct arm_smccc_res res;
int ret;
- if (!host->reg_avdd09)
+ if (!host->reg_avdd09 && !host->reg_avdd09_1)
return 0;
- ret = regulator_enable(host->reg_avdd09);
- if (ret) {
- dev_err(host->hba->dev, "Failed to enable avdd09-supply: %pe\n",
- ERR_PTR(ret));
- return ret;
+ if (host->reg_avdd09) {
+ ret = regulator_enable(host->reg_avdd09);
+ if (ret) {
+ dev_err(host->hba->dev, "Failed to enable avdd09-supply: %pe\n",
+ ERR_PTR(ret));
+ return ret;
+ }
+ }
+
+ if (host->reg_avdd09_1) {
+ ret = regulator_enable(host->reg_avdd09_1);
+ if (ret) {
+ dev_err(host->hba->dev, "Failed to enable avdd09-1-supply: %pe\n",
+ ERR_PTR(ret));
+ return ret;
+ }
}
ufs_mtk_va09_pwr_ctrl(res, 1);
@@ -1232,20 +1257,33 @@ static int ufs_mtk_get_supplies(struct ufs_mtk_host *host)
struct device *dev = host->hba->dev;
const struct ufs_mtk_soc_data *data = of_device_get_match_data(dev);
- if (!data || !data->has_avdd09)
+ if (!data)
return 0;
- host->reg_avdd09 = devm_regulator_get_optional(dev, "avdd09");
- if (IS_ERR(host->reg_avdd09)) {
- if (PTR_ERR(host->reg_avdd09) == -ENODEV) {
+ if (data->has_avdd09) {
+ host->reg_avdd09 = devm_regulator_get_optional(dev, "avdd09");
+ if (IS_ERR(host->reg_avdd09)) {
+ if (PTR_ERR(host->reg_avdd09) != -ENODEV) {
+ return dev_err_probe(dev,
+ PTR_ERR(host->reg_avdd09),
+ "Failed to get avdd09 regulator: %pe\n",
+ host->reg_avdd09);
+ }
host->reg_avdd09 = NULL;
- return 0;
}
+ }
- return dev_err_probe(dev,
- PTR_ERR(host->reg_avdd09),
- "Failed to get avdd09 regulator: %pe\n",
- host->reg_avdd09);
+ if (data->has_avdd09_1) {
+ host->reg_avdd09_1 = devm_regulator_get_optional(dev, "avdd09-1");
+ if (IS_ERR(host->reg_avdd09_1)) {
+ if (PTR_ERR(host->reg_avdd09_1) != -ENODEV) {
+ return dev_err_probe(dev,
+ PTR_ERR(host->reg_avdd09_1),
+ "Failed to get avdd09-1 regulator: %pe\n",
+ host->reg_avdd09);
+ }
+ host->reg_avdd09_1 = NULL;
+ }
}
return 0;
diff --git a/drivers/ufs/host/ufs-mediatek.h b/drivers/ufs/host/ufs-mediatek.h
index c63740b98e85..477fb9e36555 100644
--- a/drivers/ufs/host/ufs-mediatek.h
+++ b/drivers/ufs/host/ufs-mediatek.h
@@ -176,6 +176,7 @@ struct ufs_mtk_mcq_intr_info {
struct ufs_mtk_host {
struct phy *mphy;
struct regulator *reg_avdd09;
+ struct regulator *reg_avdd09_1;
struct reset_control_bulk_data resets[MTK_UFS_NUM_RESETS];
struct ufs_hba *hba;
struct ufs_mtk_crypt_cfg *crypt;
--
2.55.0
More information about the linux-arm-kernel
mailing list