|
@@ -47,6 +47,7 @@ struct imx6_pcie {
|
|
|
u32 tx_deemph_gen2_6db;
|
|
|
u32 tx_swing_full;
|
|
|
u32 tx_swing_low;
|
|
|
+ int link_gen;
|
|
|
};
|
|
|
|
|
|
/* PCIe Root Complex registers (memory-mapped) */
|
|
@@ -471,11 +472,15 @@ static int imx6_pcie_establish_link(struct pcie_port *pp)
|
|
|
goto err_reset_phy;
|
|
|
}
|
|
|
|
|
|
- /* Allow Gen2 mode after the link is up. */
|
|
|
- tmp = readl(pp->dbi_base + PCIE_RC_LCR);
|
|
|
- tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
|
|
|
- tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2;
|
|
|
- writel(tmp, pp->dbi_base + PCIE_RC_LCR);
|
|
|
+ if (imx6_pcie->link_gen == 2) {
|
|
|
+ /* Allow Gen2 mode after the link is up. */
|
|
|
+ tmp = readl(pp->dbi_base + PCIE_RC_LCR);
|
|
|
+ tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
|
|
|
+ tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2;
|
|
|
+ writel(tmp, pp->dbi_base + PCIE_RC_LCR);
|
|
|
+ } else {
|
|
|
+ dev_info(pp->dev, "Link: Gen2 disabled\n");
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Start Directed Speed Change so the best possible speed both link
|
|
@@ -499,8 +504,7 @@ static int imx6_pcie_establish_link(struct pcie_port *pp)
|
|
|
}
|
|
|
|
|
|
tmp = readl(pp->dbi_base + PCIE_RC_LCSR);
|
|
|
- dev_dbg(pp->dev, "Link up, Gen=%i\n", (tmp >> 16) & 0xf);
|
|
|
-
|
|
|
+ dev_info(pp->dev, "Link up, Gen%i\n", (tmp >> 16) & 0xf);
|
|
|
return 0;
|
|
|
|
|
|
err_reset_phy:
|
|
@@ -678,6 +682,12 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
|
|
|
&imx6_pcie->tx_swing_low))
|
|
|
imx6_pcie->tx_swing_low = 127;
|
|
|
|
|
|
+ /* Limit link speed */
|
|
|
+ ret = of_property_read_u32(pp->dev->of_node, "fsl,max-link-speed",
|
|
|
+ &imx6_pcie->link_gen);
|
|
|
+ if (ret)
|
|
|
+ imx6_pcie->link_gen = 1;
|
|
|
+
|
|
|
ret = imx6_add_pcie_port(pp, pdev);
|
|
|
if (ret < 0)
|
|
|
return ret;
|