* [PATCH v5 0/4] i.MX7 PCI support
@ 2017-02-20 15:30 Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw)
To: linux-pci
Cc: Andrey Smirnov, linux-kernel, Bjorn Helgaas, Rob Herring,
Fabio Estevam, yurovsky, linux-arm-kernel, Lucas Stach
Hello, everyone:
This is a fifth iteration of the code that adds PCI-subsystem bits
necessary for enabling PCI support on i.MX7.
Rob, Bjorn, power domain and reset bindings remained the same, please
let me know if you still think that PHY aspect of the driver needs to
be moved into a separate abstraction.
Changes since v4 (can be found at [version4]):
- Dropped typo-fix patch (originally patch #1 of the
series). Bjorn, I am assuming that patch from v4 survived
and stayed in your tree, let me know if that is not true.
- Added patch with workaround to address speed change false
failures (I kept it as a separate patch to better document
exchange with NXP/Freescale that lead to that patch)
- Added patch to avoid speed change on links configured Gen1
only (Let me know if that is a terrible idea)
- Addressed section mismatch problem by moving call to
hook_fault_code to happend before driver registration.
Changes since v3 (can be found at [version3]):
- Move all of the reset_control_assert's into imx6_pcie_assert_core_reset
- Documented required reset and power domain DT bindings
Changes since v2 (can be found at [version2]):
- Collected Reviewed-by for patch #2 from Lucas
- Reset logic implementation moved out into a reset controller
driver (see [reset1])
- Removed unused leftover code
Changes since v1 (can be found at [version1]):
- All GPC related code moved into a separate driver (see [gpc1])
- Removed GPIO probe deferral logging
- Fixed section mismatch warning
- Minor reformatting of fsl,imx6q-pcie.txt(as per Rob
Herring's request)
[version4] https://lkml.org/lkml/2017/2/7/478
[version3] https://lkml.org/lkml/2017/2/6/565
[version2] https://lkml.org/lkml/2017/2/1/510
[version1] https://lkml.org/lkml/2017/1/19/488
[gpc1] https://lkml.org/lkml/2017/2/6/551
[reset1] https://lkml.org/lkml/2017/2/6/554
Andrey Smirnov (4):
PCI: imx6: Add code to support i.MX7D
PCI: imx6: Do not wait for speed change on i.MX7
PCI: imx6: Do not switch speed if Gen2 is disabled
PCI: imx6: Allow probe deferal by reset GPIO
.../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 +-
drivers/pci/host/pci-imx6.c | 199 +++++++++++++++------
include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 +
3 files changed, 161 insertions(+), 55 deletions(-)
--
2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
@ 2017-02-20 15:30 ` Andrey Smirnov
2017-03-14 14:43 ` Lee Jones
2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov
` (3 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw)
To: linux-pci
Cc: Mark Rutland, devicetree, Andrey Smirnov, linux-kernel,
Fabio Estevam, Rob Herring, Bjorn Helgaas, yurovsky, Lee Jones,
linux-arm-kernel, Lucas Stach
Add various bits of code needed to support i.MX7D variant of the IP.
Cc: yurovsky@gmail.com
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
.../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 ++-
drivers/pci/host/pci-imx6.c | 121 ++++++++++++++++-----
include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 +
3 files changed, 112 insertions(+), 26 deletions(-)
diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
index 83aeb1f..11db2ab 100644
--- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
+++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
@@ -4,7 +4,11 @@ This PCIe host controller is based on the Synopsis Designware PCIe IP
and thus inherits all the common properties defined in designware-pcie.txt.
Required properties:
-- compatible: "fsl,imx6q-pcie", "fsl,imx6sx-pcie", "fsl,imx6qp-pcie"
+- compatible:
+ - "fsl,imx6q-pcie"
+ - "fsl,imx6sx-pcie",
+ - "fsl,imx6qp-pcie"
+ - "fsl,imx7d-pcie"
- reg: base address and length of the PCIe controller
- interrupts: A list of interrupt outputs of the controller. Must contain an
entry for each entry in the interrupt-names property.
@@ -34,6 +38,13 @@ Additional required properties for imx6sx-pcie:
- clock names: Must include the following additional entries:
- "pcie_inbound_axi"
+Additional required properties for imx7d-pcie:
+- power-domains: Must be set to a phandle pointing to PCIE_PHY power domain
+- resets: Must contain phandles to PCIE related reset lines exposed by SRC IP block
+- reset-names: Must contain the following entires:
+ - "pciephy"
+ - "apps"
+
Example:
pcie@0x01000000 {
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 50a1291..2f3f375 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -17,6 +17,7 @@
#include <linux/kernel.h>
#include <linux/mfd/syscon.h>
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
+#include <linux/mfd/syscon/imx7-iomuxc-gpr.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/of_device.h>
@@ -27,6 +28,7 @@
#include <linux/signal.h>
#include <linux/types.h>
#include <linux/interrupt.h>
+#include <linux/reset.h>
#include "pcie-designware.h"
@@ -36,6 +38,7 @@ enum imx6_pcie_variants {
IMX6Q,
IMX6SX,
IMX6QP,
+ IMX7D,
};
struct imx6_pcie {
@@ -47,6 +50,8 @@ struct imx6_pcie {
struct clk *pcie_inbound_axi;
struct clk *pcie;
struct regmap *iomuxc_gpr;
+ struct reset_control *pciephy_reset;
+ struct reset_control *apps_reset;
enum imx6_pcie_variants variant;
u32 tx_deemph_gen1;
u32 tx_deemph_gen2_3p5db;
@@ -56,6 +61,11 @@ struct imx6_pcie {
int link_gen;
};
+/* Parameters for the waiting for PCIe PHY PLL to lock on i.MX7 */
+#define PHY_PLL_LOCK_WAIT_MAX_RETRIES 2000
+#define PHY_PLL_LOCK_WAIT_USLEEP_MIN 50
+#define PHY_PLL_LOCK_WAIT_USLEEP_MAX 200
+
/* PCIe Root Complex registers (memory-mapped) */
#define PCIE_RC_LCR 0x7c
#define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1 0x1
@@ -251,6 +261,10 @@ static void imx6_pcie_assert_core_reset(struct imx6_pcie *imx6_pcie)
u32 val, gpr1, gpr12;
switch (imx6_pcie->variant) {
+ case IMX7D:
+ reset_control_assert(imx6_pcie->pciephy_reset);
+ reset_control_assert(imx6_pcie->apps_reset);
+ break;
case IMX6SX:
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
IMX6SX_GPR12_PCIE_TEST_POWERDOWN,
@@ -333,11 +347,33 @@ static int imx6_pcie_enable_ref_clk(struct imx6_pcie *imx6_pcie)
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
IMX6Q_GPR1_PCIE_REF_CLK_EN, 1 << 16);
break;
+ case IMX7D:
+ break;
}
return ret;
}
+static void imx7d_pcie_wait_for_phy_pll_lock(struct imx6_pcie *imx6_pcie)
+{
+ u32 val;
+ unsigned int retries;
+ struct pcie_port *pp = &imx6_pcie->pp;
+ struct device *dev = pp->dev;
+
+ for (retries = 0; retries < PHY_PLL_LOCK_WAIT_MAX_RETRIES; retries++) {
+ regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR22, &val);
+
+ if (val & IMX7D_GPR22_PCIE_PHY_PLL_LOCKED)
+ return;
+
+ usleep_range(PHY_PLL_LOCK_WAIT_USLEEP_MIN,
+ PHY_PLL_LOCK_WAIT_USLEEP_MAX);
+ }
+
+ dev_err(dev, "PCIe PLL lock timeout\n");
+}
+
static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
{
struct pcie_port *pp = &imx6_pcie->pp;
@@ -381,6 +417,10 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
}
switch (imx6_pcie->variant) {
+ case IMX7D:
+ reset_control_deassert(imx6_pcie->pciephy_reset);
+ imx7d_pcie_wait_for_phy_pll_lock(imx6_pcie);
+ break;
case IMX6SX:
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR5,
IMX6SX_GPR5_PCIE_BTNRST_RESET, 0);
@@ -407,35 +447,44 @@ static void imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie)
static void imx6_pcie_init_phy(struct imx6_pcie *imx6_pcie)
{
- if (imx6_pcie->variant == IMX6SX)
+ switch (imx6_pcie->variant) {
+ case IMX7D:
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+ IMX7D_GPR12_PCIE_PHY_REFCLK_SEL, 0);
+ break;
+ case IMX6SX:
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
IMX6SX_GPR12_PCIE_RX_EQ_MASK,
IMX6SX_GPR12_PCIE_RX_EQ_2);
+ /* FALLTHROUGH */
+ default:
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+ IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
- IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
+ /* configure constant input signal to the pcie ctrl and phy */
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+ IMX6Q_GPR12_LOS_LEVEL, 9 << 4);
+
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
+ IMX6Q_GPR8_TX_DEEMPH_GEN1,
+ imx6_pcie->tx_deemph_gen1 << 0);
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
+ IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB,
+ imx6_pcie->tx_deemph_gen2_3p5db << 6);
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
+ IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB,
+ imx6_pcie->tx_deemph_gen2_6db << 12);
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
+ IMX6Q_GPR8_TX_SWING_FULL,
+ imx6_pcie->tx_swing_full << 18);
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
+ IMX6Q_GPR8_TX_SWING_LOW,
+ imx6_pcie->tx_swing_low << 25);
+ break;
+ }
- /* configure constant input signal to the pcie ctrl and phy */
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
IMX6Q_GPR12_DEVICE_TYPE, PCI_EXP_TYPE_ROOT_PORT << 12);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
- IMX6Q_GPR12_LOS_LEVEL, 9 << 4);
-
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
- IMX6Q_GPR8_TX_DEEMPH_GEN1,
- imx6_pcie->tx_deemph_gen1 << 0);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
- IMX6Q_GPR8_TX_DEEMPH_GEN2_3P5DB,
- imx6_pcie->tx_deemph_gen2_3p5db << 6);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
- IMX6Q_GPR8_TX_DEEMPH_GEN2_6DB,
- imx6_pcie->tx_deemph_gen2_6db << 12);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
- IMX6Q_GPR8_TX_SWING_FULL,
- imx6_pcie->tx_swing_full << 18);
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR8,
- IMX6Q_GPR8_TX_SWING_LOW,
- imx6_pcie->tx_swing_low << 25);
}
static int imx6_pcie_wait_for_link(struct imx6_pcie *imx6_pcie)
@@ -498,8 +547,11 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
dw_pcie_writel_rc(pp, PCIE_RC_LCR, tmp);
/* Start LTSSM. */
- regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
- IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
+ if (imx6_pcie->variant == IMX7D)
+ reset_control_deassert(imx6_pcie->apps_reset);
+ else
+ regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
+ IMX6Q_GPR12_PCIE_CTL_2, 1 << 10);
ret = imx6_pcie_wait_for_link(imx6_pcie);
if (ret) {
@@ -674,13 +726,31 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
return PTR_ERR(imx6_pcie->pcie);
}
- if (imx6_pcie->variant == IMX6SX) {
+ switch (imx6_pcie->variant) {
+ case IMX6SX:
imx6_pcie->pcie_inbound_axi = devm_clk_get(dev,
"pcie_inbound_axi");
if (IS_ERR(imx6_pcie->pcie_inbound_axi)) {
dev_err(dev, "pcie_inbound_axi clock missing or invalid\n");
return PTR_ERR(imx6_pcie->pcie_inbound_axi);
}
+ break;
+ case IMX7D:
+ imx6_pcie->pciephy_reset = devm_reset_control_get(dev,
+ "pciephy");
+ if (IS_ERR(imx6_pcie->pciephy_reset)) {
+ dev_err(dev, "Failed to get PCIEPHY reset contol\n");
+ return PTR_ERR(imx6_pcie->pciephy_reset);
+ }
+
+ imx6_pcie->apps_reset = devm_reset_control_get(dev, "apps");
+ if (IS_ERR(imx6_pcie->apps_reset)) {
+ dev_err(dev, "Failed to get PCIE APPS reset contol\n");
+ return PTR_ERR(imx6_pcie->apps_reset);
+ }
+ break;
+ default:
+ break;
}
/* Grab GPR config register range */
@@ -738,6 +808,7 @@ static const struct of_device_id imx6_pcie_of_match[] = {
{ .compatible = "fsl,imx6q-pcie", .data = (void *)IMX6Q, },
{ .compatible = "fsl,imx6sx-pcie", .data = (void *)IMX6SX, },
{ .compatible = "fsl,imx6qp-pcie", .data = (void *)IMX6QP, },
+ { .compatible = "fsl,imx7d-pcie", .data = (void *)IMX7D, },
{},
};
diff --git a/include/linux/mfd/syscon/imx7-iomuxc-gpr.h b/include/linux/mfd/syscon/imx7-iomuxc-gpr.h
index 4585d61..abbd524 100644
--- a/include/linux/mfd/syscon/imx7-iomuxc-gpr.h
+++ b/include/linux/mfd/syscon/imx7-iomuxc-gpr.h
@@ -44,4 +44,8 @@
#define IMX7D_GPR5_CSI_MUX_CONTROL_MIPI (0x1 << 4)
+#define IMX7D_GPR12_PCIE_PHY_REFCLK_SEL BIT(5)
+
+#define IMX7D_GPR22_PCIE_PHY_PLL_LOCKED BIT(31)
+
#endif /* __LINUX_IMX7_IOMUXC_GPR_H */
--
2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov
@ 2017-02-20 15:30 ` Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw)
To: linux-pci; +Cc: Andrey Smirnov
As can be seen from [1]:
"...the different behavior between iMX6Q PCIe and iMX7D PCIe maybe
caused by the different controller version.
Regarding to the DOC description, the DIRECT_SPEED_CHANGE should be
cleared after the speed change from GEN1 to GEN2. Unfortunately, when
GEN1 device is used, the behavior is not documented.
So, IC design guys run the simulation and
find out the following behaviors:
1. DIRECT_SPEED_CHANGE will be cleared in 7D after speed change
from GEN1 to GEN2. This matches doc’s description
2. set MAX link speed(PCIE_CAP_TARGET_LINK_SPEED=0x01) as GEN1 and
re-run the simulation, DIRECT_SPEED_CHANGE will not be cleared;
remain as 1, this matches your result, but function test is
passed, so this bit should not affect the normal PCIe function.
..."
imx6_pcie_wait_for_speed_change will report false failures for Gen1 ->
Gen1 speed transition, so avoid doing that check and just rely on
imx6_pcie_wait_for_link only.
[1] https://community.nxp.com/message/867943
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
drivers/pci/host/pci-imx6.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 2f3f375..473bbdc 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -577,10 +577,21 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
tmp |= PORT_LOGIC_SPEED_CHANGE;
dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);
- ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
- if (ret) {
- dev_err(dev, "Failed to bring link up!\n");
- goto err_reset_phy;
+ if (imx6_pcie->variant != IMX7D) {
+ /*
+ * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
+ * from i.MX6 family when no link speed transition
+ * occurs and we go Gen1 -> yep, Gen1. The difference
+ * is that, in such case, it will not be cleared by HW
+ * which will cause the following code to report false
+ * failure.
+ */
+
+ ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
+ if (ret) {
+ dev_err(dev, "Failed to bring link up!\n");
+ goto err_reset_phy;
+ }
}
/* Make sure link training is finished as well! */
--
2.9.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov
@ 2017-02-20 15:30 ` Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov
2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw)
To: linux-pci; +Cc: Andrey Smirnov
Save a bit of time and avoid going through link speed change procedure
in configuration where link max speed is limited to Gen1 in DT.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
drivers/pci/host/pci-imx6.c | 52 ++++++++++++++++++++++-----------------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 473bbdc..071251f3 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -565,40 +565,40 @@ static int imx6_pcie_establish_link(struct imx6_pcie *imx6_pcie)
tmp &= ~PCIE_RC_LCR_MAX_LINK_SPEEDS_MASK;
tmp |= PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2;
dw_pcie_writel_rc(pp, PCIE_RC_LCR, tmp);
- } else {
- dev_info(dev, "Link: Gen2 disabled\n");
- }
-
- /*
- * Start Directed Speed Change so the best possible speed both link
- * partners support can be negotiated.
- */
- tmp = dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL);
- tmp |= PORT_LOGIC_SPEED_CHANGE;
- dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);
- if (imx6_pcie->variant != IMX7D) {
/*
- * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
- * from i.MX6 family when no link speed transition
- * occurs and we go Gen1 -> yep, Gen1. The difference
- * is that, in such case, it will not be cleared by HW
- * which will cause the following code to report false
- * failure.
+ * Start Directed Speed Change so the best possible
+ * speed both link partners support can be negotiated.
*/
+ tmp = dw_pcie_readl_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL);
+ tmp |= PORT_LOGIC_SPEED_CHANGE;
+ dw_pcie_writel_rc(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, tmp);
+
+ if (imx6_pcie->variant != IMX7D) {
+ /*
+ * On i.MX7, DIRECT_SPEED_CHANGE behaves differently
+ * from i.MX6 family when no link speed transition
+ * occurs and we go Gen1 -> yep, Gen1. The difference
+ * is that, in such case, it will not be cleared by HW
+ * which will cause the following code to report false
+ * failure.
+ */
+
+ ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
+ if (ret) {
+ dev_err(dev, "Failed to bring link up!\n");
+ goto err_reset_phy;
+ }
+ }
- ret = imx6_pcie_wait_for_speed_change(imx6_pcie);
+ /* Make sure link training is finished as well! */
+ ret = imx6_pcie_wait_for_link(imx6_pcie);
if (ret) {
dev_err(dev, "Failed to bring link up!\n");
goto err_reset_phy;
}
- }
-
- /* Make sure link training is finished as well! */
- ret = imx6_pcie_wait_for_link(imx6_pcie);
- if (ret) {
- dev_err(dev, "Failed to bring link up!\n");
- goto err_reset_phy;
+ } else {
+ dev_info(dev, "Link: Gen2 disabled\n");
}
tmp = dw_pcie_readl_rc(pp, PCIE_RC_LCSR);
--
2.9.3
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
` (2 preceding siblings ...)
2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov
@ 2017-02-20 15:30 ` Andrey Smirnov
2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:30 UTC (permalink / raw)
To: linux-pci
Cc: Andrey Smirnov, linux-kernel, Fabio Estevam, Bjorn Helgaas,
yurovsky, linux-arm-kernel, Lucas Stach
Some designs implement reset GPIO via a GPIO expander connected to a
peripheral bus. One such example would be i.MX7 Sabre board where said
GPIO is provided by SPI shift register connected to a bitbanged SPI
bus. In order to support such designs allow reset GPIO request to defer
probing of the driver.
Cc: yurovsky@gmail.com
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Fabio Estevam <fabio.estevam@nxp.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
drivers/pci/host/pci-imx6.c | 25 +++++++++++++++++--------
1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c
index 071251f3..fe832e7f 100644
--- a/drivers/pci/host/pci-imx6.c
+++ b/drivers/pci/host/pci-imx6.c
@@ -638,8 +638,8 @@ static struct pcie_host_ops imx6_pcie_host_ops = {
.host_init = imx6_pcie_host_init,
};
-static int __init imx6_add_pcie_port(struct imx6_pcie *imx6_pcie,
- struct platform_device *pdev)
+static int imx6_add_pcie_port(struct imx6_pcie *imx6_pcie,
+ struct platform_device *pdev)
{
struct pcie_port *pp = &imx6_pcie->pp;
struct device *dev = pp->dev;
@@ -674,7 +674,7 @@ static int __init imx6_add_pcie_port(struct imx6_pcie *imx6_pcie,
return 0;
}
-static int __init imx6_pcie_probe(struct platform_device *pdev)
+static int imx6_pcie_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct imx6_pcie *imx6_pcie;
@@ -693,10 +693,6 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
imx6_pcie->variant =
(enum imx6_pcie_variants)of_device_get_match_data(dev);
- /* Added for PCI abort handling */
- hook_fault_code(16 + 6, imx6q_pcie_abort_handler, SIGBUS, 0,
- "imprecise external abort");
-
dbi_base = platform_get_resource(pdev, IORESOURCE_MEM, 0);
pp->dbi_base = devm_ioremap_resource(dev, dbi_base);
if (IS_ERR(pp->dbi_base))
@@ -716,6 +712,8 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
dev_err(dev, "unable to get reset gpio\n");
return ret;
}
+ } else if (imx6_pcie->reset_gpio == -EPROBE_DEFER) {
+ return imx6_pcie->reset_gpio;
}
/* Fetch clocks */
@@ -828,11 +826,22 @@ static struct platform_driver imx6_pcie_driver = {
.name = "imx6q-pcie",
.of_match_table = imx6_pcie_of_match,
},
+ .probe = imx6_pcie_probe,
.shutdown = imx6_pcie_shutdown,
};
static int __init imx6_pcie_init(void)
{
- return platform_driver_probe(&imx6_pcie_driver, imx6_pcie_probe);
+ /*
+ * Since probe() can be deferred we need to make sure that
+ * hook_fault_code is not called after __init memory is freed
+ * by kernel and since imx6q_pcie_abort_handler() is a no-op
+ * we can install the handler here without risking it
+ * accessing some unitialized driver state
+ */
+ hook_fault_code(16 + 6, imx6q_pcie_abort_handler, SIGBUS, 0,
+ "imprecise external abort");
+
+ return platform_driver_register(&imx6_pcie_driver);
}
device_initcall(imx6_pcie_init);
--
2.9.3
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 0/4] i.MX7 PCI support
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
` (3 preceding siblings ...)
2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov
@ 2017-02-20 15:47 ` Andrey Smirnov
4 siblings, 0 replies; 7+ messages in thread
From: Andrey Smirnov @ 2017-02-20 15:47 UTC (permalink / raw)
To: linux-pci
Cc: Andrey Smirnov, linux-kernel, Bjorn Helgaas, Rob Herring,
Fabio Estevam, Andrey Yurovsky, linux-arm-kernel, Lucas Stach
Ugh. Forgot to add correct CC list to patches #2 and #3 and drop
Lucas' Reviewed-by from patch #4 since code there changed. Please
ignore this thread. I'll resend all of the patches with aforementioned
corrections shortly.
Sorry for the noise.
Andrey
On Mon, Feb 20, 2017 at 7:30 AM, Andrey Smirnov
<andrew.smirnov@gmail.com> wrote:
> Hello, everyone:
>
> This is a fifth iteration of the code that adds PCI-subsystem bits
> necessary for enabling PCI support on i.MX7.
>
> Rob, Bjorn, power domain and reset bindings remained the same, please
> let me know if you still think that PHY aspect of the driver needs to
> be moved into a separate abstraction.
>
> Changes since v4 (can be found at [version4]):
>
> - Dropped typo-fix patch (originally patch #1 of the
> series). Bjorn, I am assuming that patch from v4 survived
> and stayed in your tree, let me know if that is not true.
>
> - Added patch with workaround to address speed change false
> failures (I kept it as a separate patch to better document
> exchange with NXP/Freescale that lead to that patch)
>
> - Added patch to avoid speed change on links configured Gen1
> only (Let me know if that is a terrible idea)
>
> - Addressed section mismatch problem by moving call to
> hook_fault_code to happend before driver registration.
>
> Changes since v3 (can be found at [version3]):
> - Move all of the reset_control_assert's into imx6_pcie_assert_core_reset
> - Documented required reset and power domain DT bindings
>
> Changes since v2 (can be found at [version2]):
>
> - Collected Reviewed-by for patch #2 from Lucas
> - Reset logic implementation moved out into a reset controller
> driver (see [reset1])
> - Removed unused leftover code
>
> Changes since v1 (can be found at [version1]):
>
> - All GPC related code moved into a separate driver (see [gpc1])
> - Removed GPIO probe deferral logging
> - Fixed section mismatch warning
> - Minor reformatting of fsl,imx6q-pcie.txt(as per Rob
> Herring's request)
>
> [version4] https://lkml.org/lkml/2017/2/7/478
> [version3] https://lkml.org/lkml/2017/2/6/565
> [version2] https://lkml.org/lkml/2017/2/1/510
> [version1] https://lkml.org/lkml/2017/1/19/488
> [gpc1] https://lkml.org/lkml/2017/2/6/551
> [reset1] https://lkml.org/lkml/2017/2/6/554
>
> Andrey Smirnov (4):
> PCI: imx6: Add code to support i.MX7D
> PCI: imx6: Do not wait for speed change on i.MX7
> PCI: imx6: Do not switch speed if Gen2 is disabled
> PCI: imx6: Allow probe deferal by reset GPIO
>
> .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 13 +-
> drivers/pci/host/pci-imx6.c | 199 +++++++++++++++------
> include/linux/mfd/syscon/imx7-iomuxc-gpr.h | 4 +
> 3 files changed, 161 insertions(+), 55 deletions(-)
>
> --
> 2.9.3
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D
2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov
@ 2017-03-14 14:43 ` Lee Jones
0 siblings, 0 replies; 7+ messages in thread
From: Lee Jones @ 2017-03-14 14:43 UTC (permalink / raw)
To: Andrey Smirnov
Cc: Mark Rutland, devicetree, linux-pci, linux-kernel, Fabio Estevam,
Rob Herring, Bjorn Helgaas, yurovsky, linux-arm-kernel,
Lucas Stach
T24gTW9uLCAyMCBGZWIgMjAxNywgQW5kcmV5IFNtaXJub3Ygd3JvdGU6Cgo+IEFkZCB2YXJpb3Vz
IGJpdHMgb2YgY29kZSBuZWVkZWQgdG8gc3VwcG9ydCBpLk1YN0QgdmFyaWFudCBvZiB0aGUgSVAu
Cj4gCj4gQ2M6IHl1cm92c2t5QGdtYWlsLmNvbQo+IENjOiBMdWNhcyBTdGFjaCA8bC5zdGFjaEBw
ZW5ndXRyb25peC5kZT4KPiBDYzogQmpvcm4gSGVsZ2FhcyA8YmhlbGdhYXNAZ29vZ2xlLmNvbT4K
PiBDYzogUm9iIEhlcnJpbmcgPHJvYmgrZHRAa2VybmVsLm9yZz4KPiBDYzogTWFyayBSdXRsYW5k
IDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KPiBDYzogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJv
Lm9yZz4KPiBDYzogRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBueHAuY29tPgo+IENjOiBs
aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKPiBDYzogZGV2aWNldHJlZUB2Z2Vy
Lmtlcm5lbC5vcmcKPiBDYzogbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwo+IFNpZ25lZC1v
ZmYtYnk6IEFuZHJleSBTbWlybm92IDxhbmRyZXcuc21pcm5vdkBnbWFpbC5jb20+Cj4gLS0tCj4g
IC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQgICAgIHwgIDEz
ICsrLQo+ICBkcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMgICAgICAgICAgICAgICAgICAgICAg
ICB8IDEyMSArKysrKysrKysrKysrKysrLS0tLS0KCj4gIGluY2x1ZGUvbGludXgvbWZkL3N5c2Nv
bi9pbXg3LWlvbXV4Yy1ncHIuaCAgICAgICAgIHwgICA0ICsKCkFja2VkLWJ5OiBMZWUgSm9uZXMg
PGxlZS5qb25lc0BsaW5hcm8ub3JnPgoKPiAgMyBmaWxlcyBjaGFuZ2VkLCAxMTIgaW5zZXJ0aW9u
cygrKSwgMjYgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2
aWNldHJlZS9iaW5kaW5ncy9wY2kvZnNsLGlteDZxLXBjaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9k
ZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQKPiBpbmRleCA4M2FlYjFm
Li4xMWRiMmFiIDEwMDY0NAo+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5n
cy9wY2kvZnNsLGlteDZxLXBjaWUudHh0Cj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVl
L2JpbmRpbmdzL3BjaS9mc2wsaW14NnEtcGNpZS50eHQKPiBAQCAtNCw3ICs0LDExIEBAIFRoaXMg
UENJZSBob3N0IGNvbnRyb2xsZXIgaXMgYmFzZWQgb24gdGhlIFN5bm9wc2lzIERlc2lnbndhcmUg
UENJZSBJUAo+ICBhbmQgdGh1cyBpbmhlcml0cyBhbGwgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGRl
ZmluZWQgaW4gZGVzaWdud2FyZS1wY2llLnR4dC4KPiAgCj4gIFJlcXVpcmVkIHByb3BlcnRpZXM6
Cj4gLS0gY29tcGF0aWJsZTogImZzbCxpbXg2cS1wY2llIiwgImZzbCxpbXg2c3gtcGNpZSIsICJm
c2wsaW14NnFwLXBjaWUiCj4gKy0gY29tcGF0aWJsZToKPiArCS0gImZzbCxpbXg2cS1wY2llIgo+
ICsJLSAiZnNsLGlteDZzeC1wY2llIiwKPiArCS0gImZzbCxpbXg2cXAtcGNpZSIKPiArCS0gImZz
bCxpbXg3ZC1wY2llIgo+ICAtIHJlZzogYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIFBD
SWUgY29udHJvbGxlcgo+ICAtIGludGVycnVwdHM6IEEgbGlzdCBvZiBpbnRlcnJ1cHQgb3V0cHV0
cyBvZiB0aGUgY29udHJvbGxlci4gTXVzdCBjb250YWluIGFuCj4gICAgZW50cnkgZm9yIGVhY2gg
ZW50cnkgaW4gdGhlIGludGVycnVwdC1uYW1lcyBwcm9wZXJ0eS4KPiBAQCAtMzQsNiArMzgsMTMg
QEAgQWRkaXRpb25hbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBpbXg2c3gtcGNpZToKPiAgLSBj
bG9jayBuYW1lczogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBlbnRyaWVz
Ogo+ICAJLSAicGNpZV9pbmJvdW5kX2F4aSIKPiAgCj4gK0FkZGl0aW9uYWwgcmVxdWlyZWQgcHJv
cGVydGllcyBmb3IgaW14N2QtcGNpZToKPiArLSBwb3dlci1kb21haW5zOiBNdXN0IGJlIHNldCB0
byBhIHBoYW5kbGUgcG9pbnRpbmcgdG8gUENJRV9QSFkgcG93ZXIgZG9tYWluCj4gKy0gcmVzZXRz
OiBNdXN0IGNvbnRhaW4gcGhhbmRsZXMgdG8gUENJRSByZWxhdGVkIHJlc2V0IGxpbmVzIGV4cG9z
ZWQgYnkgU1JDIElQIGJsb2NrCj4gKy0gcmVzZXQtbmFtZXM6IE11c3QgY29udGFpbiB0aGUgZm9s
bG93aW5nIGVudGlyZXM6Cj4gKyAgCSAgICAgICAtICJwY2llcGh5Igo+ICsJICAgICAgIC0gImFw
cHMiCj4gKwo+ICBFeGFtcGxlOgo+ICAKPiAgCXBjaWVAMHgwMTAwMDAwMCB7Cj4gZGlmZiAtLWdp
dCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlt
eDYuYwo+IGluZGV4IDUwYTEyOTEuLjJmM2YzNzUgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wY2kv
aG9zdC9wY2ktaW14Ni5jCj4gKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCj4gQEAg
LTE3LDYgKzE3LDcgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICAjaW5jbHVkZSA8
bGludXgvbWZkL3N5c2Nvbi5oPgo+ICAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi9pbXg2cS1p
b211eGMtZ3ByLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uL2lteDctaW9tdXhjLWdw
ci5oPgo+ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9vZl9n
cGlvLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiBAQCAtMjcsNiArMjgsNyBA
QAo+ICAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Cj4gICNpbmNsdWRlIDxsaW51eC90eXBlcy5o
Pgo+ICAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZXNl
dC5oPgo+ICAKPiAgI2luY2x1ZGUgInBjaWUtZGVzaWdud2FyZS5oIgo+ICAKPiBAQCAtMzYsNiAr
MzgsNyBAQCBlbnVtIGlteDZfcGNpZV92YXJpYW50cyB7Cj4gIAlJTVg2USwKPiAgCUlNWDZTWCwK
PiAgCUlNWDZRUCwKPiArCUlNWDdELAo+ICB9Owo+ICAKPiAgc3RydWN0IGlteDZfcGNpZSB7Cj4g
QEAgLTQ3LDYgKzUwLDggQEAgc3RydWN0IGlteDZfcGNpZSB7Cj4gIAlzdHJ1Y3QgY2xrCQkqcGNp
ZV9pbmJvdW5kX2F4aTsKPiAgCXN0cnVjdCBjbGsJCSpwY2llOwo+ICAJc3RydWN0IHJlZ21hcAkJ
KmlvbXV4Y19ncHI7Cj4gKwlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcGNpZXBoeV9yZXNldDsKPiAr
CXN0cnVjdCByZXNldF9jb250cm9sCSphcHBzX3Jlc2V0Owo+ICAJZW51bSBpbXg2X3BjaWVfdmFy
aWFudHMgdmFyaWFudDsKPiAgCXUzMgkJCXR4X2RlZW1waF9nZW4xOwo+ICAJdTMyCQkJdHhfZGVl
bXBoX2dlbjJfM3A1ZGI7Cj4gQEAgLTU2LDYgKzYxLDExIEBAIHN0cnVjdCBpbXg2X3BjaWUgewo+
ICAJaW50CQkJbGlua19nZW47Cj4gIH07Cj4gIAo+ICsvKiBQYXJhbWV0ZXJzIGZvciB0aGUgd2Fp
dGluZyBmb3IgUENJZSBQSFkgUExMIHRvIGxvY2sgb24gaS5NWDcgKi8KPiArI2RlZmluZSBQSFlf
UExMX0xPQ0tfV0FJVF9NQVhfUkVUUklFUwkyMDAwCj4gKyNkZWZpbmUgUEhZX1BMTF9MT0NLX1dB
SVRfVVNMRUVQX01JTgk1MAo+ICsjZGVmaW5lIFBIWV9QTExfTE9DS19XQUlUX1VTTEVFUF9NQVgJ
MjAwCj4gKwo+ICAvKiBQQ0llIFJvb3QgQ29tcGxleCByZWdpc3RlcnMgKG1lbW9yeS1tYXBwZWQp
ICovCj4gICNkZWZpbmUgUENJRV9SQ19MQ1IJCQkJMHg3Ywo+ICAjZGVmaW5lIFBDSUVfUkNfTENS
X01BWF9MSU5LX1NQRUVEU19HRU4xCTB4MQo+IEBAIC0yNTEsNiArMjYxLDEwIEBAIHN0YXRpYyB2
b2lkIGlteDZfcGNpZV9hc3NlcnRfY29yZV9yZXNldChzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3Bj
aWUpCj4gIAl1MzIgdmFsLCBncHIxLCBncHIxMjsKPiAgCj4gIAlzd2l0Y2ggKGlteDZfcGNpZS0+
dmFyaWFudCkgewo+ICsJY2FzZSBJTVg3RDoKPiArCQlyZXNldF9jb250cm9sX2Fzc2VydChpbXg2
X3BjaWUtPnBjaWVwaHlfcmVzZXQpOwo+ICsJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGlteDZfcGNp
ZS0+YXBwc19yZXNldCk7Cj4gKwkJYnJlYWs7Cj4gIAljYXNlIElNWDZTWDoKPiAgCQlyZWdtYXBf
dXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsCj4gIAkJCQkg
ICBJTVg2U1hfR1BSMTJfUENJRV9URVNUX1BPV0VSRE9XTiwKPiBAQCAtMzMzLDExICszNDcsMzMg
QEAgc3RhdGljIGludCBpbXg2X3BjaWVfZW5hYmxlX3JlZl9jbGsoc3RydWN0IGlteDZfcGNpZSAq
aW14Nl9wY2llKQo+ICAJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIs
IElPTVVYQ19HUFIxLAo+ICAJCQkJICAgSU1YNlFfR1BSMV9QQ0lFX1JFRl9DTEtfRU4sIDEgPDwg
MTYpOwo+ICAJCWJyZWFrOwo+ICsJY2FzZSBJTVg3RDoKPiArCQlicmVhazsKPiAgCX0KPiAgCj4g
IAlyZXR1cm4gcmV0Owo+ICB9Cj4gIAo+ICtzdGF0aWMgdm9pZCBpbXg3ZF9wY2llX3dhaXRfZm9y
X3BoeV9wbGxfbG9jayhzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3BjaWUpCj4gK3sKPiArCXUzMiB2
YWw7Cj4gKwl1bnNpZ25lZCBpbnQgcmV0cmllczsKPiArCXN0cnVjdCBwY2llX3BvcnQgKnBwID0g
JmlteDZfcGNpZS0+cHA7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwcC0+ZGV2Owo+ICsKPiAr
CWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBQSFlfUExMX0xPQ0tfV0FJVF9NQVhfUkVUUklF
UzsgcmV0cmllcysrKSB7Cj4gKwkJcmVnbWFwX3JlYWQoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJ
T01VWENfR1BSMjIsICZ2YWwpOwo+ICsKPiArCQlpZiAodmFsICYgSU1YN0RfR1BSMjJfUENJRV9Q
SFlfUExMX0xPQ0tFRCkKPiArCQkJcmV0dXJuOwo+ICsKPiArCQl1c2xlZXBfcmFuZ2UoUEhZX1BM
TF9MT0NLX1dBSVRfVVNMRUVQX01JTiwKPiArCQkJICAgICBQSFlfUExMX0xPQ0tfV0FJVF9VU0xF
RVBfTUFYKTsKPiArCX0KPiArCj4gKwlkZXZfZXJyKGRldiwgIlBDSWUgUExMIGxvY2sgdGltZW91
dFxuIik7Cj4gK30KPiArCj4gIHN0YXRpYyB2b2lkIGlteDZfcGNpZV9kZWFzc2VydF9jb3JlX3Jl
c2V0KHN0cnVjdCBpbXg2X3BjaWUgKmlteDZfcGNpZSkKPiAgewo+ICAJc3RydWN0IHBjaWVfcG9y
dCAqcHAgPSAmaW14Nl9wY2llLT5wcDsKPiBAQCAtMzgxLDYgKzQxNywxMCBAQCBzdGF0aWMgdm9p
ZCBpbXg2X3BjaWVfZGVhc3NlcnRfY29yZV9yZXNldChzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3Bj
aWUpCj4gIAl9Cj4gIAo+ICAJc3dpdGNoIChpbXg2X3BjaWUtPnZhcmlhbnQpIHsKPiArCWNhc2Ug
SU1YN0Q6Cj4gKwkJcmVzZXRfY29udHJvbF9kZWFzc2VydChpbXg2X3BjaWUtPnBjaWVwaHlfcmVz
ZXQpOwo+ICsJCWlteDdkX3BjaWVfd2FpdF9mb3JfcGh5X3BsbF9sb2NrKGlteDZfcGNpZSk7Cj4g
KwkJYnJlYWs7Cj4gIAljYXNlIElNWDZTWDoKPiAgCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9w
Y2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSNSwKPiAgCQkJCSAgIElNWDZTWF9HUFI1X1BDSUVf
QlROUlNUX1JFU0VULCAwKTsKPiBAQCAtNDA3LDM1ICs0NDcsNDQgQEAgc3RhdGljIHZvaWQgaW14
Nl9wY2llX2RlYXNzZXJ0X2NvcmVfcmVzZXQoc3RydWN0IGlteDZfcGNpZSAqaW14Nl9wY2llKQo+
ICAKPiAgc3RhdGljIHZvaWQgaW14Nl9wY2llX2luaXRfcGh5KHN0cnVjdCBpbXg2X3BjaWUgKmlt
eDZfcGNpZSkKPiAgewo+IC0JaWYgKGlteDZfcGNpZS0+dmFyaWFudCA9PSBJTVg2U1gpCj4gKwlz
d2l0Y2ggKGlteDZfcGNpZS0+dmFyaWFudCkgewo+ICsJY2FzZSBJTVg3RDoKPiArCQlyZWdtYXBf
dXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSMTIsCj4gKwkJCQkg
ICBJTVg3RF9HUFIxMl9QQ0lFX1BIWV9SRUZDTEtfU0VMLCAwKTsKPiArCQlicmVhazsKPiArCWNh
c2UgSU1YNlNYOgo+ICAJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3BjaWUtPmlvbXV4Y19ncHIs
IElPTVVYQ19HUFIxMiwKPiAgCQkJCSAgIElNWDZTWF9HUFIxMl9QQ0lFX1JYX0VRX01BU0ssCj4g
IAkJCQkgICBJTVg2U1hfR1BSMTJfUENJRV9SWF9FUV8yKTsKPiArCQkvKiBGQUxMVEhST1VHSCAq
Lwo+ICsJZGVmYXVsdDoKPiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNf
Z3ByLCBJT01VWENfR1BSMTIsCj4gKwkJCQkgICBJTVg2UV9HUFIxMl9QQ0lFX0NUTF8yLCAwIDw8
IDEwKTsKPiAgCj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJ
T01VWENfR1BSMTIsCj4gLQkJCUlNWDZRX0dQUjEyX1BDSUVfQ1RMXzIsIDAgPDwgMTApOwo+ICsJ
CS8qIGNvbmZpZ3VyZSBjb25zdGFudCBpbnB1dCBzaWduYWwgdG8gdGhlIHBjaWUgY3RybCBhbmQg
cGh5ICovCj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N
VVhDX0dQUjEyLAo+ICsJCQkJICAgSU1YNlFfR1BSMTJfTE9TX0xFVkVMLCA5IDw8IDQpOwo+ICsK
PiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BS
OCwKPiArCQkJCSAgIElNWDZRX0dQUjhfVFhfREVFTVBIX0dFTjEsCj4gKwkJCQkgICBpbXg2X3Bj
aWUtPnR4X2RlZW1waF9nZW4xIDw8IDApOwo+ICsJCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3Bj
aWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFI4LAo+ICsJCQkJICAgSU1YNlFfR1BSOF9UWF9ERUVN
UEhfR0VOMl8zUDVEQiwKPiArCQkJCSAgIGlteDZfcGNpZS0+dHhfZGVlbXBoX2dlbjJfM3A1ZGIg
PDwgNik7Cj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N
VVhDX0dQUjgsCj4gKwkJCQkgICBJTVg2UV9HUFI4X1RYX0RFRU1QSF9HRU4yXzZEQiwKPiArCQkJ
CSAgIGlteDZfcGNpZS0+dHhfZGVlbXBoX2dlbjJfNmRiIDw8IDEyKTsKPiArCQlyZWdtYXBfdXBk
YXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSOCwKPiArCQkJCSAgIElN
WDZRX0dQUjhfVFhfU1dJTkdfRlVMTCwKPiArCQkJCSAgIGlteDZfcGNpZS0+dHhfc3dpbmdfZnVs
bCA8PCAxOCk7Cj4gKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwg
SU9NVVhDX0dQUjgsCj4gKwkJCQkgICBJTVg2UV9HUFI4X1RYX1NXSU5HX0xPVywKPiArCQkJCSAg
IGlteDZfcGNpZS0+dHhfc3dpbmdfbG93IDw8IDI1KTsKPiArCQlicmVhazsKPiArCX0KPiAgCj4g
LQkvKiBjb25maWd1cmUgY29uc3RhbnQgaW5wdXQgc2lnbmFsIHRvIHRoZSBwY2llIGN0cmwgYW5k
IHBoeSAqLwo+ICAJcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9N
VVhDX0dQUjEyLAo+ICAJCQlJTVg2UV9HUFIxMl9ERVZJQ0VfVFlQRSwgUENJX0VYUF9UWVBFX1JP
T1RfUE9SVCA8PCAxMik7Cj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNf
Z3ByLCBJT01VWENfR1BSMTIsCj4gLQkJCUlNWDZRX0dQUjEyX0xPU19MRVZFTCwgOSA8PCA0KTsK
PiAtCj4gLQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENf
R1BSOCwKPiAtCQkJICAgSU1YNlFfR1BSOF9UWF9ERUVNUEhfR0VOMSwKPiAtCQkJICAgaW14Nl9w
Y2llLT50eF9kZWVtcGhfZ2VuMSA8PCAwKTsKPiAtCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2X3Bj
aWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFI4LAo+IC0JCQkgICBJTVg2UV9HUFI4X1RYX0RFRU1Q
SF9HRU4yXzNQNURCLAo+IC0JCQkgICBpbXg2X3BjaWUtPnR4X2RlZW1waF9nZW4yXzNwNWRiIDw8
IDYpOwo+IC0JcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhD
X0dQUjgsCj4gLQkJCSAgIElNWDZRX0dQUjhfVFhfREVFTVBIX0dFTjJfNkRCLAo+IC0JCQkgICBp
bXg2X3BjaWUtPnR4X2RlZW1waF9nZW4yXzZkYiA8PCAxMik7Cj4gLQlyZWdtYXBfdXBkYXRlX2Jp
dHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BSOCwKPiAtCQkJICAgSU1YNlFfR1BS
OF9UWF9TV0lOR19GVUxMLAo+IC0JCQkgICBpbXg2X3BjaWUtPnR4X3N3aW5nX2Z1bGwgPDwgMTgp
Owo+IC0JcmVnbWFwX3VwZGF0ZV9iaXRzKGlteDZfcGNpZS0+aW9tdXhjX2dwciwgSU9NVVhDX0dQ
UjgsCj4gLQkJCSAgIElNWDZRX0dQUjhfVFhfU1dJTkdfTE9XLAo+IC0JCQkgICBpbXg2X3BjaWUt
PnR4X3N3aW5nX2xvdyA8PCAyNSk7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQgaW14Nl9wY2llX3dh
aXRfZm9yX2xpbmsoc3RydWN0IGlteDZfcGNpZSAqaW14Nl9wY2llKQo+IEBAIC00OTgsOCArNTQ3
LDExIEBAIHN0YXRpYyBpbnQgaW14Nl9wY2llX2VzdGFibGlzaF9saW5rKHN0cnVjdCBpbXg2X3Bj
aWUgKmlteDZfcGNpZSkKPiAgCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBQQ0lFX1JDX0xDUiwgdG1w
KTsKPiAgCj4gIAkvKiBTdGFydCBMVFNTTS4gKi8KPiAtCXJlZ21hcF91cGRhdGVfYml0cyhpbXg2
X3BjaWUtPmlvbXV4Y19ncHIsIElPTVVYQ19HUFIxMiwKPiAtCQkJSU1YNlFfR1BSMTJfUENJRV9D
VExfMiwgMSA8PCAxMCk7Cj4gKwlpZiAoaW14Nl9wY2llLT52YXJpYW50ID09IElNWDdEKQo+ICsJ
CXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQoaW14Nl9wY2llLT5hcHBzX3Jlc2V0KTsKPiArCWVsc2UK
PiArCQlyZWdtYXBfdXBkYXRlX2JpdHMoaW14Nl9wY2llLT5pb211eGNfZ3ByLCBJT01VWENfR1BS
MTIsCj4gKwkJCQkgICBJTVg2UV9HUFIxMl9QQ0lFX0NUTF8yLCAxIDw8IDEwKTsKPiAgCj4gIAly
ZXQgPSBpbXg2X3BjaWVfd2FpdF9mb3JfbGluayhpbXg2X3BjaWUpOwo+ICAJaWYgKHJldCkgewo+
IEBAIC02NzQsMTMgKzcyNiwzMSBAQCBzdGF0aWMgaW50IF9faW5pdCBpbXg2X3BjaWVfcHJvYmUo
c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiAgCQlyZXR1cm4gUFRSX0VSUihpbXg2X3Bj
aWUtPnBjaWUpOwo+ICAJfQo+ICAKPiAtCWlmIChpbXg2X3BjaWUtPnZhcmlhbnQgPT0gSU1YNlNY
KSB7Cj4gKwlzd2l0Y2ggKGlteDZfcGNpZS0+dmFyaWFudCkgewo+ICsJY2FzZSBJTVg2U1g6Cj4g
IAkJaW14Nl9wY2llLT5wY2llX2luYm91bmRfYXhpID0gZGV2bV9jbGtfZ2V0KGRldiwKPiAgCQkJ
CQkJCSAgICJwY2llX2luYm91bmRfYXhpIik7Cj4gIAkJaWYgKElTX0VSUihpbXg2X3BjaWUtPnBj
aWVfaW5ib3VuZF9heGkpKSB7Cj4gIAkJCWRldl9lcnIoZGV2LCAicGNpZV9pbmJvdW5kX2F4aSBj
bG9jayBtaXNzaW5nIG9yIGludmFsaWRcbiIpOwo+ICAJCQlyZXR1cm4gUFRSX0VSUihpbXg2X3Bj
aWUtPnBjaWVfaW5ib3VuZF9heGkpOwo+ICAJCX0KPiArCQlicmVhazsKPiArCWNhc2UgSU1YN0Q6
Cj4gKwkJaW14Nl9wY2llLT5wY2llcGh5X3Jlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChk
ZXYsCj4gKwkJCQkJCQkJICAicGNpZXBoeSIpOwo+ICsJCWlmIChJU19FUlIoaW14Nl9wY2llLT5w
Y2llcGh5X3Jlc2V0KSkgewo+ICsJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgUENJRVBI
WSByZXNldCBjb250b2xcbiIpOwo+ICsJCQlyZXR1cm4gUFRSX0VSUihpbXg2X3BjaWUtPnBjaWVw
aHlfcmVzZXQpOwo+ICsJCX0KPiArCj4gKwkJaW14Nl9wY2llLT5hcHBzX3Jlc2V0ID0gZGV2bV9y
ZXNldF9jb250cm9sX2dldChkZXYsICJhcHBzIik7Cj4gKwkJaWYgKElTX0VSUihpbXg2X3BjaWUt
PmFwcHNfcmVzZXQpKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBQQ0lFIEFQ
UFMgcmVzZXQgY29udG9sXG4iKTsKPiArCQkJcmV0dXJuIFBUUl9FUlIoaW14Nl9wY2llLT5hcHBz
X3Jlc2V0KTsKPiArCQl9Cj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCWJyZWFrOwo+ICAJ
fQo+ICAKPiAgCS8qIEdyYWIgR1BSIGNvbmZpZyByZWdpc3RlciByYW5nZSAqLwo+IEBAIC03Mzgs
NiArODA4LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14Nl9wY2llX29m
X21hdGNoW10gPSB7Cj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cS1wY2llIiwgIC5kYXRh
ID0gKHZvaWQgKilJTVg2USwgIH0sCj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2c3gtcGNp
ZSIsIC5kYXRhID0gKHZvaWQgKilJTVg2U1gsIH0sCj4gIAl7IC5jb21wYXRpYmxlID0gImZzbCxp
bXg2cXAtcGNpZSIsIC5kYXRhID0gKHZvaWQgKilJTVg2UVAsIH0sCj4gKwl7IC5jb21wYXRpYmxl
ID0gImZzbCxpbXg3ZC1wY2llIiwgIC5kYXRhID0gKHZvaWQgKilJTVg3RCwgIH0sCj4gIAl7fSwK
PiAgfTsKPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3N5c2Nvbi9pbXg3LWlv
bXV4Yy1ncHIuaCBiL2luY2x1ZGUvbGludXgvbWZkL3N5c2Nvbi9pbXg3LWlvbXV4Yy1ncHIuaAo+
IGluZGV4IDQ1ODVkNjEuLmFiYmQ1MjQgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9tZmQv
c3lzY29uL2lteDctaW9tdXhjLWdwci5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc3lzY29u
L2lteDctaW9tdXhjLWdwci5oCj4gQEAgLTQ0LDQgKzQ0LDggQEAKPiAgCj4gICNkZWZpbmUgSU1Y
N0RfR1BSNV9DU0lfTVVYX0NPTlRST0xfTUlQSQkJKDB4MSA8PCA0KQo+ICAKPiArI2RlZmluZSBJ
TVg3RF9HUFIxMl9QQ0lFX1BIWV9SRUZDTEtfU0VMCQlCSVQoNSkKPiArCj4gKyNkZWZpbmUgSU1Y
N0RfR1BSMjJfUENJRV9QSFlfUExMX0xPQ0tFRAkJQklUKDMxKQo+ICsKPiAgI2VuZGlmIC8qIF9f
TElOVVhfSU1YN19JT01VWENfR1BSX0ggKi8KCi0tIApMZWUgSm9uZXMKTGluYXJvIFNUTWljcm9l
bGVjdHJvbmljcyBMYW5kaW5nIFRlYW0gTGVhZApMaW5hcm8ub3JnIOKUgiBPcGVuIHNvdXJjZSBz
b2Z0d2FyZSBmb3IgQVJNIFNvQ3MKRm9sbG93IExpbmFybzogRmFjZWJvb2sgfCBUd2l0dGVyIHwg
QmxvZwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGlu
dXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRl
YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt
YXJtLWtlcm5lbAo=
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-03-14 14:43 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-20 15:30 [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 1/4] PCI: imx6: Add code to support i.MX7D Andrey Smirnov
2017-03-14 14:43 ` Lee Jones
2017-02-20 15:30 ` [PATCH v5 2/4] PCI: imx6: Do not wait for speed change on i.MX7 Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 3/4] PCI: imx6: Do not switch speed if Gen2 is disabled Andrey Smirnov
2017-02-20 15:30 ` [PATCH v5 4/4] PCI: imx6: Allow probe deferal by reset GPIO Andrey Smirnov
2017-02-20 15:47 ` [PATCH v5 0/4] i.MX7 PCI support Andrey Smirnov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).