From 764ec29f32a7c4242f5a3d255ef6782218f44ebc Mon Sep 17 00:00:00 2001 From: Andrey Safonov Date: Sun, 17 Dec 2023 12:30:51 +0300 Subject: [PATCH] Rockchip64 PCIE PHY reset on probe (#6057) * rk3399 PCIE PHY reset on probe --- .../rockchip64-6.1/rk3399-fix-pci-phy.patch | 47 +++++++++++++++++++ .../rockchip64-6.6/rk3399-fix-pci-phy.patch | 47 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 patch/kernel/archive/rockchip64-6.1/rk3399-fix-pci-phy.patch create mode 100644 patch/kernel/archive/rockchip64-6.6/rk3399-fix-pci-phy.patch diff --git a/patch/kernel/archive/rockchip64-6.1/rk3399-fix-pci-phy.patch b/patch/kernel/archive/rockchip64-6.1/rk3399-fix-pci-phy.patch new file mode 100644 index 000000000..21b02b310 --- /dev/null +++ b/patch/kernel/archive/rockchip64-6.1/rk3399-fix-pci-phy.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Andrey Safonov +Date: Sat, 16 Dec 2023 22:46:35 +0300 +Subject: rk3399 PCIE PHY reset on probe + +Signed-off-by: Andrey Safonov +--- + 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 + diff --git a/patch/kernel/archive/rockchip64-6.6/rk3399-fix-pci-phy.patch b/patch/kernel/archive/rockchip64-6.6/rk3399-fix-pci-phy.patch new file mode 100644 index 000000000..21b02b310 --- /dev/null +++ b/patch/kernel/archive/rockchip64-6.6/rk3399-fix-pci-phy.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Andrey Safonov +Date: Sat, 16 Dec 2023 22:46:35 +0300 +Subject: rk3399 PCIE PHY reset on probe + +Signed-off-by: Andrey Safonov +--- + 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 +