Skip to contentSkip to conversation

PCI: dw-rockchip: Simplify regulator setup with devm_regulator_get_enable_optional()

PATCH Applied Anand Moon 2 participants 6 messages Sep 5, 2025 – Nov 1, 2025

Subsystems (3)
lore
Share & tools
lore

Anand Moon

author
#0 lore raw

PATCH 1/1 PCI: dw-rockchip: Simplify regulator setup with devm_regulator_get_enable_optional()

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

---
 drivers/pci/controller/dwc/pcie-dw-rockchip.c | 23 +++++--------------
 1 file changed, 6 insertions(+), 17 deletions(-)
drivers/pci/controller/dwc/pcie-dw-rockchip.c +6 -17
index b5f5eee5a50e..56baca52c3e9 100644
@@ -76,7 +76,6 @@ struct rockchip_pcie {
 	unsigned int clk_cnt;
 	struct reset_control *rst;
 	struct gpio_desc *rst_gpio;
-	struct regulator *vpcie3v3;
 	struct irq_domain *irq_domain;
 	const struct rockchip_pcie_of_data *data;
 };
@@ -644,22 +643,15 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 		return ret;
 
 	/* DON'T MOVE ME: must be enable before PHY init */
-	rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
-	if (IS_ERR(rockchip->vpcie3v3)) {
-		if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV)
-			return dev_err_probe(dev, PTR_ERR(rockchip->vpcie3v3),
-					"failed to get vpcie3v3 regulator\n");
-		rockchip->vpcie3v3 = NULL;
-	} else {
-		ret = regulator_enable(rockchip->vpcie3v3);
-		if (ret)
-			return dev_err_probe(dev, ret,
-					     "failed to enable vpcie3v3 regulator\n");
-	}
+	ret = devm_regulator_get_enable_optional(dev, "vpcie3v3");
+	if (ret < 0 && ret != -ENODEV)
+		return dev_err_probe(dev, ret,
+				     "failed to enable vpcie3v3 regulator\n");
 
 	ret = rockchip_pcie_phy_init(rockchip);
 	if (ret)
-		goto disable_regulator;
+		return dev_err_probe(dev, ret,
+				     "failed to initialize the phy\n");
 
 	ret = reset_control_deassert(rockchip->rst);
 	if (ret)
@@ -692,9 +684,6 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
 	clk_bulk_disable_unprepare(rockchip->clk_cnt, rockchip->clks);
 deinit_phy:
 	rockchip_pcie_phy_deinit(rockchip);
-disable_regulator:
-	if (rockchip->vpcie3v3)
-		regulator_disable(rockchip->vpcie3v3);
 
 	return ret;
 }

base-commit: d69eb204c255c35abd9e8cb621484e8074c75eaa

Signature · 1 line
2.50.1
author
#1 lore raw

Hi All,

Quoted 7 lines · Anand Moon

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

Quoted 5 lines
---
 drivers/pci/controller/dwc/pcie-dw-rockchip.c | 23 +++++--------------
 1 file changed, 6 insertions(+), 17 deletions(-)

If we compile the kernel with phy and regulator as modules, I observe this message.

[   25.473960][   T55] platform 3c0800000.pcie: deferred probe
pending: platform: supplier regulator-vcc3v3-pcie not ready
[   25.474071][   T55] platform fe0a0000.hdmi: deferred probe pending:
platform: wait for supplier /i2c@fdd40000/pmic@20/regulators/LDO_REG9
[   25.474124][   T55] platform regulator-vcc5v0-usb-otg: deferred
probe pending: reg-fixed-voltage: can't get GPIO
[   25.474171][   T55] platform fdc20000.syscon:io-domains: deferred
probe pending: platform: wait for supplier
/i2c@fdd40000/pmic@20/regulators/SWITCH_REG1
[   25.474218][   T55] platform cpufreq-dt: deferred probe pending:
(reason unknown)
[   25.474264][   T55] platform regulator-vcc3v3-pcie: deferred probe
pending: reg-fixed-voltage: can't get GPIO
[   25.474343][   T55] rockchip-pm-domain
fdd90000.power-management:power-controller: Timed out. Forcing
sync_state()
[   37.744968][ T2415] psi: inconsistent task state!
task=2280:(udev-worker) cpu=1 psi_flags=4 clear=0 set=4
[   37.849725][   T50] fan53555-regulator 3-001c: FAN53555 Option[12]
Rev[15] Detected!
[   37.990008][ T2216] SCSI subsystem initialized

Thanks
-Anand

#2 lore raw
Quoted 31 lines · Anand Moon

Hi All,

Quoted 7 lines · Anand Moon

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

Quoted 5 lines
---
 drivers/pci/controller/dwc/pcie-dw-rockchip.c | 23 +++++--------------
 1 file changed, 6 insertions(+), 17 deletions(-)

If we compile the kernel with phy and regulator as modules, I observe this message.

[   25.473960][   T55] platform 3c0800000.pcie: deferred probe
pending: platform: supplier regulator-vcc3v3-pcie not ready
[   25.474071][   T55] platform fe0a0000.hdmi: deferred probe pending:
platform: wait for supplier /i2c@fdd40000/pmic@20/regulators/LDO_REG9
[   25.474124][   T55] platform regulator-vcc5v0-usb-otg: deferred
probe pending: reg-fixed-voltage: can't get GPIO
[   25.474171][   T55] platform fdc20000.syscon:io-domains: deferred
probe pending: platform: wait for supplier
/i2c@fdd40000/pmic@20/regulators/SWITCH_REG1
[   25.474218][   T55] platform cpufreq-dt: deferred probe pending:
(reason unknown)
[   25.474264][   T55] platform regulator-vcc3v3-pcie: deferred probe

pending: reg-fixed-voltage: can't get GPIO

Quoted 9 lines
[   25.474343][   T55] rockchip-pm-domain
fdd90000.power-management:power-controller: Timed out. Forcing
sync_state()
[   37.744968][ T2415] psi: inconsistent task state!
task=2280:(udev-worker) cpu=1 psi_flags=4 clear=0 set=4
[   37.849725][   T50] fan53555-regulator 3-001c: FAN53555 Option[12]
Rev[15] Detected!
[   37.990008][ T2216] SCSI subsystem initialized

This is a deferred probe log and not related to this patch or the PCIe controller driver. The controller drivers should still be functional once the dependent GPIO driver is probed.

- Mani

Signature · 1 line
மணிவண்ணன் சதாசிவம்
maintainer Applied
#3 lore raw
In reply to Anand Moon
Quoted 8 lines · Anand Moon

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

[...]

Applied, thanks!

[1/1] PCI: dw-rockchip: Simplify regulator setup with devm_regulator_get_enable_optional()

      commit: c930b10f17c03858cfe19b9873ba5240128b4d1b

Best regards,

Signature · 1 line
Manivannan Sadhasivam <[email protected]>
author
#4 lore raw

Hi Manivannan,

Quoted 10 lines · Manivannan Sadhasivam
Quoted 7 lines · Anand Moon

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

Quoted 7 lines
Quoted 1 line

[...]

Applied, thanks!

[1/1] PCI: dw-rockchip: Simplify regulator setup with devm_regulator_get_enable_optional()

      commit: c930b10f17c03858cfe19b9873ba5240128b4d1b

I am looking to suspend or resume the issue. We probably need to toggle the regulator
to maintain the power status on the PCIe controller. Therefore, dropping the patch is an option; I will add dev_err_probe for PHY later in the patch.

Quoted 4 lines

Best regards,
--
Manivannan Sadhasivam <[email protected]>

Thanks
-Anand

author
#5 lore raw

Hi Manivannan,

Quoted 18 lines · Anand Moon

Hi Manivannan,

Quoted 14 lines · Manivannan Sadhasivam
Quoted 8 lines · Anand Moon

Replace manual get/enable logic with devm_regulator_get_enable_optional() to reduce boilerplate and improve error handling. This devm helper ensures the regulator is enabled during probe and automatically disabled on driver removal. Dropping the vpcie3v3 struct member eliminates redundant state tracking, resulting in cleaner and more maintainable code.

[...]

Applied, thanks!

Quoted 9 lines
Quoted 3 lines

[1/1] PCI: dw-rockchip: Simplify regulator setup with devm_regulator_get_enable_optional()

      commit: c930b10f17c03858cfe19b9873ba5240128b4d1b

I am looking to suspend or resume the issue. We probably need to toggle the regulator
to maintain the power status on the PCIe controller. Therefore, dropping the patch is an option; I will add dev_err_probe for PHY later in the patch.

I found this series with the address system suspend support

[1] https://lore.kernel.org/linux-pci/20251029-rockchip-pcie-system-suspend-v4-0-ce2e1b0692d2@collabora.com/

This patch will conflict with
[2] https://lore.kernel.org/linux-pci/20251029-rockchip-pcie-system-suspend-v4-3-ce2e1b0692d2@collabora.com/

So please drop my patch.

Thanks
-Anand