UPSTREAM: PCI: rockchip: improve the deassert sequence of four reset pins
authorShawn Lin <shawn.lin@rock-chips.com>
Fri, 23 Sep 2016 02:05:59 +0000 (10:05 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 18 Oct 2016 12:35:42 +0000 (20:35 +0800)
Per TRM, we need to deassert the four reset pins simultaneously.
Currently the reset framework doesn't support that so we did it
one by one. It seems no side effect found but it does impact the
state machine of controller, so sometimes the change speed bit is
not setted when sending training sequence from recover state.
After the silicon RTL review from Soc guys, we don't need to do
the sequence recommended by TRM, and could just move the deassert
of mgmt_sticky_rst to the first place.

Change-Id: I001f3707054af98b147cb1d56b1a03e5f7d44ceb
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
(cherry picked from git.kernel.org/cgit/linux/kernel/git/next/linux-next.git
commit 58c6990c5ee772c2551193f053e51a52b9984b49)

drivers/pci/host/pcie-rockchip.c

index 91f6fa2..43b765e 100644 (file)
@@ -449,21 +449,25 @@ static int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
                return err;
        }
 
-       err = reset_control_deassert(rockchip->core_rst);
+       /*
+        * Please don't reorder the deassert sequence of the following
+        * four reset pins.
+        */
+       err = reset_control_deassert(rockchip->mgmt_sticky_rst);
        if (err) {
-               dev_err(dev, "deassert core_rst err %d\n", err);
+               dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err);
                return err;
        }
 
-       err = reset_control_deassert(rockchip->mgmt_rst);
+       err = reset_control_deassert(rockchip->core_rst);
        if (err) {
-               dev_err(dev, "deassert mgmt_rst err %d\n", err);
+               dev_err(dev, "deassert core_rst err %d\n", err);
                return err;
        }
 
-       err = reset_control_deassert(rockchip->mgmt_sticky_rst);
+       err = reset_control_deassert(rockchip->mgmt_rst);
        if (err) {
-               dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err);
+               dev_err(dev, "deassert mgmt_rst err %d\n", err);
                return err;
        }