Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 4 May 2025 17:09:30 GMT
From:      Michal Meloun <mmel@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 71279c158005 - main - rk3568 pcie: Do not require optional FDT properties.
Message-ID:  <202505041709.544H9UCb060553@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by mmel:

URL: https://cgit.FreeBSD.org/src/commit/?id=71279c158005ee5c2cca2e5c19158237119e5286

commit 71279c158005ee5c2cca2e5c19158237119e5286
Author:     Michal Meloun <mmel@FreeBSD.org>
AuthorDate: 2025-02-18 14:39:15 +0000
Commit:     Michal Meloun <mmel@FreeBSD.org>
CommitDate: 2025-05-04 11:48:47 +0000

    rk3568 pcie: Do not require optional FDT properties.
    
    - "vpcie3v3-supply" is documented as an optional, do not require it.
    - fix handling of the another  optional property "reset-gpios".
    - while I'm in, fix  errors reporting in rk3568_pcie_init_soc()
    
    MFC after:      2 weeks
    Reviewed by:    andrew
    Differential Revision:  https://reviews.freebsd.org/D50102
---
 sys/arm64/rockchip/rk3568_pcie.c | 62 ++++++++++++++++++++++++++++------------
 1 file changed, 43 insertions(+), 19 deletions(-)

diff --git a/sys/arm64/rockchip/rk3568_pcie.c b/sys/arm64/rockchip/rk3568_pcie.c
index 9e3a1fa054cc..ac9d0a713886 100644
--- a/sys/arm64/rockchip/rk3568_pcie.c
+++ b/sys/arm64/rockchip/rk3568_pcie.c
@@ -139,21 +139,43 @@ rk3568_pcie_init_soc(device_t dev)
 	int err, count;
 	bool status;
 
+	/* Assert PCIe reset */
+	if (sc->reset_gpio != NULL) {
+		if (gpio_pin_setflags(sc->reset_gpio, GPIO_PIN_OUTPUT)) {
+			device_printf(dev, "Could not setup PCIe reset\n");
+			return (ENXIO);
+		}
+		if (gpio_pin_set_active(sc->reset_gpio, true)) {
+			device_printf(dev, "Could not set PCIe reset\n");
+			return (ENXIO);
+		}
+	}
+
 	/* Assert reset */
-	if (hwreset_assert(sc->hwreset))
+	if (hwreset_assert(sc->hwreset)) {
 		device_printf(dev, "Could not assert reset\n");
+		return (ENXIO);
+	}
 
 	/* Powerup PCIe */
-	if (regulator_enable(sc->regulator))
-		device_printf(dev, "Cannot enable regulator\n");
+	if (sc->regulator != NULL) {
+		if (regulator_enable(sc->regulator)) {
+			device_printf(dev, "Cannot enable regulator\n");
+			return (ENXIO);
+		}
+	}
 
 	/* Enable PHY */
-	if (phy_enable(sc->phy))
+	if (phy_enable(sc->phy)) {
 		device_printf(dev, "Cannot enable phy\n");
+		return (ENXIO);
+	}
 
 	/* Deassert reset */
-	if (hwreset_deassert(sc->hwreset))
+	if (hwreset_deassert(sc->hwreset)) {
 		device_printf(dev, "Could not deassert reset\n");
+		return (ENXIO);
+	}
 
 	/* Enable clocks */
 	if ((err = clk_enable(sc->aclk_mst))) {
@@ -183,7 +205,7 @@ rk3568_pcie_init_soc(device_t dev)
 	bus_write_4(sc->apb_res, PCIE_CLIENT_GENERAL_CON,
 	    (DEVICE_TYPE_MASK << 16) | DEVICE_TYPE_RC);
 
-	/* Assert reset PCIe */
+	/* Deassert PCIe reset */
 	if ((err = gpio_pin_set_active(sc->reset_gpio, false)))
 		device_printf(dev, "reset_gpio set failed\n");
 
@@ -193,9 +215,13 @@ rk3568_pcie_init_soc(device_t dev)
 	    (LINK_REQ_RST_GRT | LTSSM_ENABLE));
 	DELAY(100000);
 
-	/* Release reset */
-	if ((err = gpio_pin_set_active(sc->reset_gpio, true)))
-		device_printf(dev, "reset_gpio release failed\n");
+	/* Release PCIe reset */
+	if (sc->reset_gpio != NULL) {
+		if (gpio_pin_set_active(sc->reset_gpio, true)) {
+			device_printf(dev, "Could not release PCIe reset");
+			return (ENXIO);
+		}
+	}
 
 	/* Wait for link up/stable */
 	for (count = 20; count; count--) {
@@ -301,8 +327,9 @@ rk3568_pcie_attach(device_t dev)
 	}
 
 	/* Get regulator if present */
-	if (regulator_get_by_ofw_property(dev, 0, "vpcie3v3-supply",
-	    &sc->regulator)) {
+	error = regulator_get_by_ofw_property(dev, 0, "vpcie3v3-supply",
+	    &sc->regulator);
+	if (error != 0 && error != ENOENT) {
 		device_printf(dev, "Cannot get regulator\n");
 		goto fail;
 	}
@@ -314,14 +341,11 @@ rk3568_pcie_attach(device_t dev)
 	}
 
 	/* Get GPIO reset */
-	if (OF_hasprop(sc->node, "reset-gpios")) {
-		if (gpio_pin_get_by_ofw_property(dev, sc->node, "reset-gpios",
-		    &sc->reset_gpio)) {
-			device_printf(dev, "Cannot get reset-gpios\n");
-			goto fail;
-		}
-		gpio_pin_setflags(sc->reset_gpio, GPIO_PIN_OUTPUT);
-		gpio_pin_set_active(sc->reset_gpio, true);
+	error = gpio_pin_get_by_ofw_property(dev, sc->node, "reset-gpios",
+		    &sc->reset_gpio);
+	if (error != 0 && error != ENOENT) {
+		device_printf(dev, "Cannot get reset-gpios\n");
+		goto fail;
 	}
 
 	/* Get clocks */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505041709.544H9UCb060553>