lede/target/linux/rockchip/patches-6.6/401-rk3399-fix-pci-phy-reset-on-probe.patch
2025-03-18 18:20:22 +08:00

48 lines
1.6 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Andrey Safonov <andrey.safonov@gmail.com>
Date: Sat, 16 Dec 2023 22:46:35 +0300
Subject: rk3399 PCIE PHY reset on probe
This patches the PCIE initialization error after warm reboot.
The root of cause is, when the device is booted after power on,
PHY stays in 'factory' state. After warm boot PHY stays in the
previous state and prevents any training, thus PCIE init fails.
Signed-off-by: Andrey Safonov <andrey.safonov@gmail.com>
---
drivers/phy/rockchip/phy-rockchip-pcie.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
--- a/drivers/phy/rockchip/phy-rockchip-pcie.c
+++ b/drivers/phy/rockchip/phy-rockchip-pcie.c
@@ -344,6 +344,20 @@ static const struct of_device_id rockchi
MODULE_DEVICE_TABLE(of, rockchip_pcie_phy_dt_ids);
+static void rockchip_pcie_phy_reset(struct rockchip_pcie_phy *rk_phy)
+{
+ int i;
+
+ for (i = 0; i < PHY_MAX_LANE_NUM; i++)
+ regmap_write(rk_phy->reg_base,
+ rk_phy->phy_data->pcie_laneoff,
+ HIWORD_UPDATE(PHY_LANE_IDLE_OFF,
+ PHY_LANE_IDLE_MASK,
+ PHY_LANE_IDLE_A_SHIFT + i));
+
+ reset_control_assert(rk_phy->phy_rst);
+}
+
static int rockchip_pcie_phy_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@@ -393,6 +407,8 @@ static int rockchip_pcie_phy_probe(struc
phy_num = (phy_num == 0) ? 1 : PHY_MAX_LANE_NUM;
dev_dbg(dev, "phy number is %d\n", phy_num);
+
+ rockchip_pcie_phy_reset(rk_phy);
for (i = 0; i < phy_num; i++) {
rk_phy->phys[i].phy = devm_phy_create(dev, dev->of_node, &ops);