Commit 3ad1d327 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Lorenzo Pieralisi

PCI: rcar: Poll PHYRDY in rcar_pcie_hw_init()

In all the R-Car gen1/2/3 manuals, we are instructed to poll PCIEPHYSR
for PHYRDY=1 at an early stage of the PCIEC initialization -- while
the driver only does this on R-Car H1 (polling a PHY specific register).
Add the PHYRDY polling to rcar_pcie_hw_init(). Note that without the
special PHY driver on the R-Car V3H (R8A77980) the PCIEC initialization
just freezes the kernel -- adding the PHYRDY polling allows the init code
to exit gracefully on timeout (PHY starts powered down after reset on this
SoC).
Signed-off-by: default avatarSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarRob Herring <robh@kernel.org>
Reviewed-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent 0ee40820
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
#define PCIECDR 0x000020 #define PCIECDR 0x000020
#define PCIEMSR 0x000028 #define PCIEMSR 0x000028
#define PCIEINTXR 0x000400 #define PCIEINTXR 0x000400
#define PCIEPHYSR 0x0007f0
#define PHYRDY BIT(0)
#define PCIEMSITXR 0x000840 #define PCIEMSITXR 0x000840
/* Transfer control */ /* Transfer control */
...@@ -527,6 +529,20 @@ static void phy_write_reg(struct rcar_pcie *pcie, ...@@ -527,6 +529,20 @@ static void phy_write_reg(struct rcar_pcie *pcie,
phy_wait_for_ack(pcie); phy_wait_for_ack(pcie);
} }
static int rcar_pcie_wait_for_phyrdy(struct rcar_pcie *pcie)
{
unsigned int timeout = 10;
while (timeout--) {
if (rcar_pci_read_reg(pcie, PCIEPHYSR) & PHYRDY)
return 0;
msleep(5);
}
return -ETIMEDOUT;
}
static int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie) static int rcar_pcie_wait_for_dl(struct rcar_pcie *pcie)
{ {
unsigned int timeout = 10; unsigned int timeout = 10;
...@@ -551,6 +567,10 @@ static int rcar_pcie_hw_init(struct rcar_pcie *pcie) ...@@ -551,6 +567,10 @@ static int rcar_pcie_hw_init(struct rcar_pcie *pcie)
/* Set mode */ /* Set mode */
rcar_pci_write_reg(pcie, 1, PCIEMSR); rcar_pci_write_reg(pcie, 1, PCIEMSR);
err = rcar_pcie_wait_for_phyrdy(pcie);
if (err)
return err;
/* /*
* Initial header for port config space is type 1, set the device * Initial header for port config space is type 1, set the device
* class to match. Hardware takes care of propagating the IDSETR * class to match. Hardware takes care of propagating the IDSETR
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment