Skip to contentSkip to conversation

PCI: starfive: Use regulator APIs instead of GPIO APIs to control the 3V3 power supply of PCIe slots

PATCH Superseded Hal Feng 1 participant 2 messages Dec 4, 2025 – Dec 8, 2025

Subsystems (3)
lore
Share & tools
lore

Hal Feng

author
#0 lore raw

PATCH 1/1 PCI: starfive: Use regulator APIs instead of GPIO APIs to control the 3V3 power supply of PCIe slots

The "enable-gpio" property is obtained to control the 3V3 power supply of PCIe slots but it is not documented in the dt-bindings and using GPIO APIs is not a standard method to control PCIe slot power, so use "vpcie3v3-supply" property and regulator APIs to replace them.

This change will break the DTs which add "enable-gpio" or "enable-gpios" property under the node with compatible "starfive,jh7110-pcie". Fortunately, there are no such DTs in the upstream mainline, so this change has no impact on the upstream mainline.
If you have used "enable-gpio" or "enable-gpios" property in your downstream DTs, please update it with "vpcie3v3-supply" after applying this commit.

---

This patch is derived from the reply of Manivannan [1]. And the previous version is [2].

Changes since [2]:
- Improve the commit messages. Add description to explain the impact of this patch.
- Remove the Fixes tag and the Tested-by tag.

[1] https://lore.kernel.org/all/xxswzi4v6gpuqbe3cczj2yjmprhvln26fl5ligsp5vkiogrnwk@hpifxivaps6j/
[2] https://lore.kernel.org/all/[email protected]/

---
 drivers/pci/controller/plda/pcie-starfive.c | 25 ++++++++++++---------
 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/pci/controller/plda/pcie-starfive.c +15 -10
index 3caf53c6c082..298036c3e7f9 100644
@@ -55,7 +55,7 @@ struct starfive_jh7110_pcie {
 	struct reset_control *resets;
 	struct clk_bulk_data *clks;
 	struct regmap *reg_syscon;
-	struct gpio_desc *power_gpio;
+	struct regulator *vpcie3v3;
 	struct gpio_desc *reset_gpio;
 	struct phy *phy;
 
@@ -153,11 +153,13 @@ static int starfive_pcie_parse_dt(struct starfive_jh7110_pcie *pcie,
 		return dev_err_probe(dev, PTR_ERR(pcie->reset_gpio),
 				     "failed to get perst-gpio\n");
 
-	pcie->power_gpio = devm_gpiod_get_optional(dev, "enable",
-						   GPIOD_OUT_LOW);
-	if (IS_ERR(pcie->power_gpio))
-		return dev_err_probe(dev, PTR_ERR(pcie->power_gpio),
-				     "failed to get power-gpio\n");
+	pcie->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
+	if (IS_ERR(pcie->vpcie3v3)) {
+		if (PTR_ERR(pcie->vpcie3v3) != -ENODEV)
+			return dev_err_probe(dev, PTR_ERR(pcie->vpcie3v3),
+					     "failed to get vpcie3v3 regulator\n");
+		pcie->vpcie3v3 = NULL;
+	}
 
 	return 0;
 }
@@ -270,8 +272,8 @@ static void starfive_pcie_host_deinit(struct plda_pcie_rp *plda)
 		container_of(plda, struct starfive_jh7110_pcie, plda);
 
 	starfive_pcie_clk_rst_deinit(pcie);
-	if (pcie->power_gpio)
-		gpiod_set_value_cansleep(pcie->power_gpio, 0);
+	if (pcie->vpcie3v3)
+		regulator_disable(pcie->vpcie3v3);
 	starfive_pcie_disable_phy(pcie);
 }
 
@@ -304,8 +306,11 @@ static int starfive_pcie_host_init(struct plda_pcie_rp *plda)
 	if (ret)
 		return ret;
 
-	if (pcie->power_gpio)
-		gpiod_set_value_cansleep(pcie->power_gpio, 1);
+	if (pcie->vpcie3v3) {
+		ret = regulator_enable(pcie->vpcie3v3);
+		if (ret)
+			dev_err_probe(dev, ret, "failed to enable vpcie3v3 regulator\n");
+	}
 
 	if (pcie->reset_gpio)
 		gpiod_set_value_cansleep(pcie->reset_gpio, 1);

base-commit: b2c27842ba853508b0da00187a7508eb3a96c8f7

Signature · 1 line
2.43.2
author
#1 lore raw
Quoted 14 lines · Hal Feng

The "enable-gpio" property is obtained to control the 3V3 power supply of PCIe slots but it is not documented in the dt-bindings and using GPIO APIs is not a standard method to control PCIe slot power, so use "vpcie3v3-supply" property and regulator APIs to replace them.

This change will break the DTs which add "enable-gpio" or "enable-gpios" property under the node with compatible "starfive,jh7110-pcie". Fortunately, there are no such DTs in the upstream mainline, so this change has no impact on the upstream mainline.
If you have used "enable-gpio" or "enable-gpios" property in your downstream DTs, please update it with "vpcie3v3-supply" after applying this commit.

Quoted 2 lines

Hi, Bjorn, Manivannan and the other PCI maintainers,

Could you please pick up this patch for the coming v6.19rc? So the VisionFive 2 Lite board can be fully supported in v6.19. If anything needed to change, please let me know and I am willing to send v2 in time. Thanks.

Best regards,
Hal

Quoted 87 lines

---

This patch is derived from the reply of Manivannan [1]. And the previous version is [2].

Changes since [2]:
- Improve the commit messages. Add description to explain the impact of this patch.
- Remove the Fixes tag and the Tested-by tag.

[1]
https://lore.kernel.org/all/xxswzi4v6gpuqbe3cczj2yjmprhvln26fl5ligsp5vkiog
rnwk@hpifxivaps6j/
[2] https://lore.kernel.org/all/20251125075604.69370-2-
[email protected]/

---
 drivers/pci/controller/plda/pcie-starfive.c | 25 ++++++++++++---------
 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/pci/controller/plda/pcie-starfive.c +8 -6
index 3caf53c6c082..298036c3e7f9 100644
@@ -55,7 +55,7 @@ struct starfive_jh7110_pcie {
 	struct reset_control *resets;
 	struct clk_bulk_data *clks;
 	struct regmap *reg_syscon;
-	struct gpio_desc *power_gpio;
+	struct regulator *vpcie3v3;
 	struct gpio_desc *reset_gpio;
 	struct phy *phy;
 
@@ -153,11 +153,13 @@ static int starfive_pcie_parse_dt(struct
 starfive_jh7110_pcie *pcie,
 		return dev_err_probe(dev, PTR_ERR(pcie->reset_gpio),
 				     "failed to get perst-gpio\n");
 
-	pcie->power_gpio = devm_gpiod_get_optional(dev, "enable",
-						   GPIOD_OUT_LOW);
-	if (IS_ERR(pcie->power_gpio))
-		return dev_err_probe(dev, PTR_ERR(pcie->power_gpio),
-				     "failed to get power-gpio\n");
+	pcie->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
+	if (IS_ERR(pcie->vpcie3v3)) {
+		if (PTR_ERR(pcie->vpcie3v3) != -ENODEV)
+			return dev_err_probe(dev, PTR_ERR(pcie->vpcie3v3),
+					     "failed to get vpcie3v3
 regulator\n");
+		pcie->vpcie3v3 = NULL;
+	}
 
drivers/pci/controller/plda/pcie-starfive.c +7 -4
 	return 0;
 }
@@ -270,8 +272,8 @@ static void starfive_pcie_host_deinit(struct
 plda_pcie_rp *plda)
 		container_of(plda, struct starfive_jh7110_pcie, plda);
 
 	starfive_pcie_clk_rst_deinit(pcie);
-	if (pcie->power_gpio)
-		gpiod_set_value_cansleep(pcie->power_gpio, 0);
+	if (pcie->vpcie3v3)
+		regulator_disable(pcie->vpcie3v3);
 	starfive_pcie_disable_phy(pcie);
 }
@@ -304,8 +306,11 @@ static int starfive_pcie_host_init(struct plda_pcie_rp
 *plda)
 	if (ret)
 		return ret;
 
-	if (pcie->power_gpio)
-		gpiod_set_value_cansleep(pcie->power_gpio, 1);
+	if (pcie->vpcie3v3) {
+		ret = regulator_enable(pcie->vpcie3v3);
+		if (ret)
+			dev_err_probe(dev, ret, "failed to enable vpcie3v3
 regulator\n");
+	}
 
drivers/pci/controller/plda/pcie-starfive.c +0 -0
 	if (pcie->reset_gpio)
 		gpiod_set_value_cansleep(pcie->reset_gpio, 1);

base-commit: b2c27842ba853508b0da00187a7508eb3a96c8f7 --
2.43.2