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

Signed-off-by: Andrey Safonov <andrey.safonov@gmail.com>
---
 drivers/phy/rockchip/phy-rockchip-pcie.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/phy/rockchip/phy-rockchip-pcie.c b/drivers/phy/rockchip/phy-rockchip-pcie.c
index 8234b83fdd88..aa5ca6db0563 100644
--- 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 rockchip_pcie_phy_dt_ids[] = {
 
 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;
@@ -394,6 +408,8 @@ static int rockchip_pcie_phy_probe(struct platform_device *pdev)
 	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);
 		if (IS_ERR(rk_phy->phys[i].phy)) {
-- 
Armbian

