mirror_ubuntu-kernels/drivers/pci/controller/dwc
Niklas Cassel 28b8d7793b PCI: dw-rockchip: Fix initial PERST# GPIO value
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: 0e898eb8df ("PCI: rockchip-dwc: Add Rockchip RK356X host controller driver")
Link: https://lore.kernel.org/linux-pci/20240417164227.398901-1-cassel@kernel.org
Tested-by: Heiko Stuebner <heiko@sntech.de>
Tested-by: Jianfeng Liu <liujianfeng1994@gmail.com>
Signed-off-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Cc: stable@vger.kernel.org	# v5.15+
2024-07-09 18:28:40 -05:00
..
Kconfig PCI: dwc: Convert SOC_SIFIVE to ARCH_SIFIVE 2023-12-16 00:22:37 +00:00
Makefile PCI: rcar-gen4: Add R-Car Gen4 PCIe controller support for host mode 2023-10-23 12:40:10 +00:00
pci-dra7xx.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pci-exynos.c Merge branch 'pci/controller/remove-void-return' 2024-01-15 12:10:40 -06:00
pci-imx6.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pci-keystone.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pci-layerscape-ep.c PCI: layerscape-ep: Use the generic dw_pcie_ep_linkdown() API to handle Link Down event 2024-07-09 18:21:11 -05:00
pci-layerscape.c Merge branch 'pci/controller/layerscape' 2024-01-15 12:10:38 -06:00
pci-meson.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-al.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-armada8k.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-artpec6.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-bt1.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-designware-ep.c PCI: dwc: ep: Enforce DWC specific 64-bit BAR limitation 2024-07-09 18:21:39 -05:00
pcie-designware-host.c PCI: dwc: Add generic MSG TLP support for sending PME_Turn_Off when system suspend 2024-07-09 18:20:15 -05:00
pcie-designware-plat.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-designware.c PCI: dwc: Add outbound MSG TLPs support 2024-07-09 18:20:08 -05:00
pcie-designware.h PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-dw-rockchip.c PCI: dw-rockchip: Fix initial PERST# GPIO value 2024-07-09 18:28:40 -05:00
pcie-fu740.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-hisi.c PCI: hisi: Avoid invalid address space conversions 2022-01-03 15:05:28 -06:00
pcie-histb.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-intel-gw.c Merge branch 'pci/controller/dwc' 2024-01-15 12:10:37 -06:00
pcie-keembay.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-kirin.c Merge branch 'pci/controller/remove-void-return' 2024-01-15 12:10:40 -06:00
pcie-qcom-ep.c PCI: qcom-ep: Use the generic dw_pcie_ep_linkdown() API to handle Link Down event 2024-07-09 18:20:49 -05:00
pcie-qcom.c pci-v6.9-changes 2024-03-14 10:58:27 -07:00
pcie-rcar-gen4.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-spear13xx.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00
pcie-tegra194-acpi.c PCI: dwc: Simplify in/outbound iATU setup methods 2022-08-01 15:15:09 -05:00
pcie-tegra194.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-uniphier-ep.c PCI: dwc: ep: Remove dw_pcie_ep_init_notify() wrapper 2024-07-09 18:20:21 -05:00
pcie-uniphier.c Merge branch 'pci/irq-clean-up' 2024-01-15 12:10:40 -06:00
pcie-visconti.c PCI: dwc: Drop host prefix from struct dw_pcie_host_ops members 2024-01-06 07:51:08 +00:00