forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rockchip: dw-rockchip: Fix initial PERST# GPIO value
Import patch from mainline Linux to fix issue with PERST# signal polarity. Quote from commit message: "This extra, very short, PERST# assertion + deassertion has been reported to cause issues with certain WLAN controllers, e.g. RTL8822CE." Signed-off-by: Daniel Golle <[email protected]>
- Loading branch information
Showing
1 changed file
with
76 additions
and
0 deletions.
There are no files selected for viewing
76 changes: 76 additions & 0 deletions
76
target/linux/rockchip/patches-6.6/310-PCI-dw-rockchip-Fix-initial-PERST-GPIO-value.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
From 28b8d7793b8573563b3d45321376f36168d77b1e Mon Sep 17 00:00:00 2001 | ||
From: Niklas Cassel <[email protected]> | ||
Date: Wed, 17 Apr 2024 18:42:26 +0200 | ||
Subject: [PATCH] PCI: dw-rockchip: Fix initial PERST# GPIO value | ||
MIME-Version: 1.0 | ||
Content-Type: text/plain; charset=UTF-8 | ||
Content-Transfer-Encoding: 8bit | ||
|
||
PERST# is active low according to the PCIe specification. | ||
|
||
However, the existing pcie-dw-rockchip.c driver does: | ||
|
||
gpiod_set_value(..., 0); msleep(100); gpiod_set_value(..., 1); | ||
|
||
when asserting + deasserting PERST#. | ||
|
||
This is of course wrong, but because all the device trees for this | ||
compatible string have also incorrectly marked this GPIO as ACTIVE_HIGH: | ||
|
||
$ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3568* | ||
$ git grep -B 10 reset-gpios arch/arm64/boot/dts/rockchip/rk3588* | ||
|
||
The actual toggling of PERST# is correct, and we cannot change it anyway, | ||
since that would break device tree compatibility. | ||
|
||
However, this driver does request the GPIO to be initialized as | ||
GPIOD_OUT_HIGH, which does cause a silly sequence where PERST# gets | ||
toggled back and forth for no good reason. | ||
|
||
Fix this by requesting the GPIO to be initialized as GPIOD_OUT_LOW (which | ||
for this driver means PERST# asserted). | ||
|
||
This will avoid an unnecessary signal change where PERST# gets deasserted | ||
(by devm_gpiod_get_optional()) and then gets asserted (by | ||
rockchip_pcie_start_link()) just a few instructions later. | ||
|
||
Before patch, debug prints on EP side, when booting RC: | ||
|
||
[ 845.606810] pci: PERST# asserted by host! | ||
[ 852.483985] pci: PERST# de-asserted by host! | ||
[ 852.503041] pci: PERST# asserted by host! | ||
[ 852.610318] pci: PERST# de-asserted by host! | ||
|
||
After patch, debug prints on EP side, when booting RC: | ||
|
||
[ 125.107921] pci: PERST# asserted by host! | ||
[ 132.111429] pci: PERST# de-asserted by host! | ||
|
||
This extra, very short, PERST# assertion + deassertion has been reported to | ||
cause issues with certain WLAN controllers, e.g. RTL8822CE. | ||
|
||
Fixes: 0e898eb8df4e ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver") | ||
Link: https://lore.kernel.org/linux-pci/[email protected] | ||
Tested-by: Heiko Stuebner <[email protected]> | ||
Tested-by: Jianfeng Liu <[email protected]> | ||
Signed-off-by: Niklas Cassel <[email protected]> | ||
Signed-off-by: Krzysztof Wilczyński <[email protected]> | ||
Signed-off-by: Bjorn Helgaas <[email protected]> | ||
Reviewed-by: Heiko Stuebner <[email protected]> | ||
Reviewed-by: Manivannan Sadhasivam <[email protected]> | ||
Cc: [email protected] # v5.15+ | ||
--- | ||
drivers/pci/controller/dwc/pcie-dw-rockchip.c | 2 +- | ||
1 file changed, 1 insertion(+), 1 deletion(-) | ||
|
||
--- a/drivers/pci/controller/dwc/pcie-dw-rockchip.c | ||
+++ b/drivers/pci/controller/dwc/pcie-dw-rockchip.c | ||
@@ -240,7 +240,7 @@ static int rockchip_pcie_resource_get(st | ||
return PTR_ERR(rockchip->apb_base); | ||
|
||
rockchip->rst_gpio = devm_gpiod_get_optional(&pdev->dev, "reset", | ||
- GPIOD_OUT_HIGH); | ||
+ GPIOD_OUT_LOW); | ||
if (IS_ERR(rockchip->rst_gpio)) | ||
return PTR_ERR(rockchip->rst_gpio); | ||
|