From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B0B2BD6ACFB for ; Thu, 18 Dec 2025 12:58:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id :MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9wF9HWm8gr9TpoDCo1Xjf0cDclQ8n+GMJgmlBkt/8Tw=; b=Gef4sbZNIV4rkk SaZgjOG2tIxR/sWmvxL8Bfm1U2BaiByEz+qxlp5b7Z9dNnnnSC2ZQmQOFi6Ba7Yxww7Vdvsyjmot2 nQDYQcVVJaBqItZmnrLCjORQ6GjNrPyLHg8ZSIzOxQ4U4hqnyQZ0JSWUMb/7ofLB10oNgqp0lcaaL /X3EFIdjpn4ADIjTsN5l7NvRBdhS9XnwmrEoJn3Am8KGA2bVFf3Y/CICQji/deXDhofyBbcTANBJR RO0xpgoo33sIPeIdSJ+kitfIme0tFlVhdOPTLTWk/vEr+e1x7GZM9ENQkraY97B9f8sATrOq/d7vG tRaRo61r1CQgn8WSra8g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1vWDZx-00000008ThH-1JRt; Thu, 18 Dec 2025 12:58:01 +0000 Received: from sender4-pp-f112.zoho.com ([136.143.188.112]) by bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux)) id 1vWDZl-00000008TU4-3Zu4; Thu, 18 Dec 2025 12:57:59 +0000 ARC-Seal: i=1; a=rsa-sha256; t=1766062660; cv=none; d=zohomail.com; s=zohoarc; b=DJbWeAaUj9WSEIKeD+7z4xIEIwg1WHGw5sl87rt+imjJ+11WPTcI+ZwXE4Oi20mA5JaVzuKxmeeOQsOsBtm/xmHQl4vmDVfQ0fzTO6W4XigbeGCIVzB4fawq35qTehlj9fV5sQ9FBUV39OpvwgWf70nM5qPm2D+ZZZO+RtZQ7kA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1766062660; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=kP6+tesLXT6b6oe8yL/PwiMt0IZtyIkk3FBpDPLGZwE=; b=A2W+zgXR8I4PP03V8yIbBaXtScXvvpC/IE004EChGUZ9WnGcjFl1mT3k9kp5fx4fGjTfvGqDf+5NO92SBud0/Lujdt3oZp2+BePUmA7Vm8oXkt6fCBl7mW8qI6/XcNSWh7LSwhPTIiWZqUq6SA7UAMHU70+gBq8zWbLzXteK1xk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=collabora.com; spf=pass smtp.mailfrom=nicolas.frattaroli@collabora.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1766062660; s=zohomail; d=collabora.com; i=nicolas.frattaroli@collabora.com; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=kP6+tesLXT6b6oe8yL/PwiMt0IZtyIkk3FBpDPLGZwE=; b=Shw6aL9ZZYU8f2qw1TB1B0HThItIk2Wqv0gB9mvnvQuDBb1TBjEgQmN5P31LB0ah X8s+4XJkjGtAZPrs/0Skb5sKU/NGpdTL/Y9GjgaItHNpMdRTsrTUgcnsyTIYnagfb5e 2X2u/QqKkLrY8+qEidHbcb9yyumaENk0ZSQVr3yo= Received: by mx.zohomail.com with SMTPS id 1766062658889766.5723795494483; Thu, 18 Dec 2025 04:57:38 -0800 (PST) From: Nicolas Frattaroli Date: Thu, 18 Dec 2025 13:55:10 +0100 Subject: [PATCH v4 20/25] scsi: ufs: mediatek: Don't acquire dvfsrc-vcore twice MIME-Version: 1.0 Message-Id: <20251218-mt8196-ufs-v4-20-ddec7a369dd2@collabora.com> References: <20251218-mt8196-ufs-v4-0-ddec7a369dd2@collabora.com> In-Reply-To: <20251218-mt8196-ufs-v4-0-ddec7a369dd2@collabora.com> To: Alim Akhtar , Avri Altman , Bart Van Assche , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Matthias Brugger , AngeloGioacchino Del Regno , Chunfeng Yun , Vinod Koul , Kishon Vijay Abraham I , Peter Wang , Stanley Jhu , "James E.J. Bottomley" , "Martin K. Petersen" , Philipp Zabel , Liam Girdwood , Mark Brown , Chaotian Jing , Neil Armstrong Cc: Louis-Alexis Eyraud , kernel@collabora.com, linux-scsi@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-phy@lists.infradead.org, Nicolas Frattaroli X-Mailer: b4 0.14.3 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20251218_045750_014255_797A271B X-CRM114-Status: GOOD ( 22.50 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org As part of its featureset, the ufs-mediatek driver needs to play with an optional dvfsrc-vcore regulator for some of them. However, it currently does this by acquiring two different references to it in two different places, needlessly duplicating logic. Move reg_vcore to the host struct, acquire it in the same function as avdd09 is acquired, and rework the users of reg_vcore. Signed-off-by: Nicolas Frattaroli --- drivers/ufs/host/ufs-mediatek.c | 73 +++++++++++++++++++---------------------- drivers/ufs/host/ufs-mediatek.h | 3 +- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c index b07776f45acb..a54c3aeb7bab 100644 --- a/drivers/ufs/host/ufs-mediatek.c +++ b/drivers/ufs/host/ufs-mediatek.c @@ -519,15 +519,13 @@ static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) { struct ufs_mtk_host *host = ufshcd_get_variant(hba); struct ufs_mtk_crypt_cfg *cfg; - struct regulator *reg; int volt, ret; - if (!ufs_mtk_is_boost_crypt_enabled(hba)) + if (!ufs_mtk_is_boost_crypt_enabled(hba) || !host->reg_vcore) return; cfg = host->crypt; volt = cfg->vcore_volt; - reg = cfg->reg_vcore; ret = clk_prepare_enable(cfg->clk_crypt_mux); if (ret) { @@ -537,7 +535,7 @@ static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) } if (boost) { - ret = regulator_set_voltage(reg, volt, INT_MAX); + ret = regulator_set_voltage(host->reg_vcore, volt, INT_MAX); if (ret) { dev_err(hba->dev, "%s: Failed to set vcore to %d: %pe\n", __func__, volt, ERR_PTR(ret)); @@ -548,7 +546,7 @@ static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) if (ret) { dev_err(hba->dev, "%s: Failed to reparent clk_crypt_perf: %pe\n", __func__, ERR_PTR(ret)); - regulator_set_voltage(reg, 0, INT_MAX); + regulator_set_voltage(host->reg_vcore, 0, INT_MAX); goto out; } } else { @@ -559,7 +557,7 @@ static void ufs_mtk_boost_crypt(struct ufs_hba *hba, bool boost) goto out; } - ret = regulator_set_voltage(reg, 0, INT_MAX); + ret = regulator_set_voltage(host->reg_vcore, 0, INT_MAX); if (ret) { dev_err(hba->dev, "%s: Failed to set vcore to minimum: %pe\n", __func__, ERR_PTR(ret)); @@ -576,16 +574,13 @@ static int ufs_mtk_init_boost_crypt(struct ufs_hba *hba) struct device *dev = hba->dev; int ret; + if (!host->reg_vcore) + return 0; + cfg = devm_kzalloc(dev, sizeof(*cfg), GFP_KERNEL); if (!cfg) return -ENOMEM; - cfg->reg_vcore = devm_regulator_get_optional(dev, "dvfsrc-vcore"); - if (IS_ERR(cfg->reg_vcore)) { - dev_err(dev, "Failed to get dvfsrc-vcore: %pe", cfg->reg_vcore); - return PTR_ERR(cfg->reg_vcore); - } - ret = of_property_read_u32(dev->of_node, "mediatek,boost-crypt-vcore-min", &cfg->vcore_volt); if (ret) { @@ -891,7 +886,6 @@ static void ufs_mtk_init_clocks(struct ufs_hba *hba) struct list_head *head = &hba->clk_list_head; struct ufs_clk_info *clki, *clki_tmp; struct device *dev = hba->dev; - struct regulator *reg; u32 volt; /* @@ -932,16 +926,8 @@ static void ufs_mtk_init_clocks(struct ufs_hba *hba) return; } - /* - * Default get vcore if dts have these settings. - * No matter clock scaling support or not. (may disable by customer) - */ - reg = devm_regulator_get_optional(dev, "dvfsrc-vcore"); - if (IS_ERR(reg)) { - if (PTR_ERR(reg) != -ENODEV) - dev_err(dev, "Failed to get dvfsrc-vcore: %pe\n", reg); + if (!host->reg_vcore) return; - } if (of_property_read_u32(dev->of_node, "mediatek,clk-scale-up-vcore-min", &volt)) { @@ -949,12 +935,11 @@ static void ufs_mtk_init_clocks(struct ufs_hba *hba) return; } - host->mclk.reg_vcore = reg; host->mclk.vcore_volt = volt; /* If default boot is max gear, request vcore */ - if (reg && volt && host->clk_scale_up) - if (regulator_set_voltage(reg, volt, INT_MAX)) + if (volt && host->clk_scale_up) + if (regulator_set_voltage(host->reg_vcore, volt, INT_MAX)) dev_err(hba->dev, "Failed to set vcore to %d\n", volt); } @@ -1066,6 +1051,17 @@ static int ufs_mtk_get_supplies(struct ufs_mtk_host *host) const struct ufs_mtk_soc_data *data = of_device_get_match_data(dev); int ret; + host->reg_vcore = devm_regulator_get_optional(dev, "dvfsrc-vcore"); + if (IS_ERR(host->reg_vcore)) { + if (PTR_ERR(host->reg_vcore) != -ENODEV) { + dev_err(dev, "Failed to get dvfsrc-vcore supply: %pe\n", + host->reg_vcore); + return PTR_ERR(host->reg_vcore); + } + + host->reg_vcore = NULL; + } + if (!data) return 0; @@ -1099,14 +1095,13 @@ static int ufs_mtk_get_supplies(struct ufs_mtk_host *host) host->reg_avdd09 = devm_regulator_get_optional(dev, "avdd09"); if (IS_ERR(host->reg_avdd09)) { - if (PTR_ERR(host->reg_avdd09) == -ENODEV) { - host->reg_avdd09 = NULL; - return 0; + if (PTR_ERR(host->reg_avdd09) != -ENODEV) { + dev_err(dev, "Failed to get avdd09 regulator: %pe\n", + host->reg_avdd09); + return PTR_ERR(host->reg_avdd09); } - dev_err(dev, "Failed to get avdd09 regulator: %pe\n", - host->reg_avdd09); - return PTR_ERR(host->reg_avdd09); + host->reg_avdd09 = NULL; } return 0; @@ -1137,6 +1132,10 @@ static int ufs_mtk_init(struct ufs_hba *hba) host->hba = hba; ufshcd_set_variant(hba, host); + err = ufs_mtk_get_supplies(host); + if (err) + goto out_variant_clear; + /* Initialize host capability */ ufs_mtk_init_host_caps(hba); @@ -1191,10 +1190,6 @@ static int ufs_mtk_init(struct ufs_hba *hba) ufs_mtk_init_clocks(hba); - err = ufs_mtk_get_supplies(host); - if (err) - goto out_phy_exit; - /* * ufshcd_vops_init() is invoked after * ufshcd_setup_clock(true) in ufshcd_hba_init() thus @@ -1940,7 +1935,6 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) struct ufs_mtk_clk *mclk = &host->mclk; struct ufs_clk_info *clki = mclk->ufs_sel_clki; struct ufs_clk_info *fde_clki = mclk->ufs_fde_clki; - struct regulator *reg; int volt, ret = 0; bool clk_bind_vcore = false; bool clk_fde_scale = false; @@ -1951,9 +1945,8 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) if (!clki || !fde_clki) return; - reg = host->mclk.reg_vcore; volt = host->mclk.vcore_volt; - if (reg && volt != 0) + if (host->reg_vcore && volt) clk_bind_vcore = true; if (mclk->ufs_fde_max_clki && mclk->ufs_fde_min_clki) @@ -1977,7 +1970,7 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) if (scale_up) { if (clk_bind_vcore) { - ret = regulator_set_voltage(reg, volt, INT_MAX); + ret = regulator_set_voltage(host->reg_vcore, volt, INT_MAX); if (ret) { dev_err(hba->dev, "Failed to set vcore to %d\n", volt); goto out; @@ -2017,7 +2010,7 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up) } if (clk_bind_vcore) { - ret = regulator_set_voltage(reg, 0, INT_MAX); + ret = regulator_set_voltage(host->reg_vcore, 0, INT_MAX); if (ret) { dev_err(hba->dev, "%s: Failed to set vcore to minimum: %pe\n", __func__, ERR_PTR(ret)); diff --git a/drivers/ufs/host/ufs-mediatek.h b/drivers/ufs/host/ufs-mediatek.h index 5f096ed3f850..9586fe9c0441 100644 --- a/drivers/ufs/host/ufs-mediatek.h +++ b/drivers/ufs/host/ufs-mediatek.h @@ -141,7 +141,6 @@ enum ufs_mtk_host_caps { }; struct ufs_mtk_crypt_cfg { - struct regulator *reg_vcore; struct clk *clk_crypt_perf; struct clk *clk_crypt_mux; struct clk *clk_crypt_lp; @@ -155,7 +154,6 @@ struct ufs_mtk_clk { struct ufs_clk_info *ufs_fde_clki; /* Mux */ struct ufs_clk_info *ufs_fde_max_clki; /* Max src */ struct ufs_clk_info *ufs_fde_min_clki; /* Min src */ - struct regulator *reg_vcore; int vcore_volt; }; @@ -174,6 +172,7 @@ struct ufs_mtk_mcq_intr_info { struct ufs_mtk_host { struct phy *mphy; struct regulator *reg_avdd09; + struct regulator *reg_vcore; struct regulator_bulk_data *reg_misc; u8 num_reg_misc; struct reset_control_bulk_data resets[MTK_UFS_NUM_RESETS]; -- 2.52.0 -- linux-phy mailing list linux-phy@lists.infradead.org https://lists.infradead.org/mailman/listinfo/linux-phy