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 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 --- 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);