From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Cross Subject: [PATCH v2 3/4] PCI: imx6: Add power-supply support Date: Mon, 22 Dec 2014 16:32:06 +0800 Message-ID: <1419237127-21763-4-git-send-email-xobs@kosagi.com> References: <1419237127-21763-1-git-send-email-xobs@kosagi.com> Return-path: In-Reply-To: <1419237127-21763-1-git-send-email-xobs@kosagi.com> Sender: linux-pci-owner@vger.kernel.org To: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Lucas Stach , Shawn Guo , Bjorn Helgaas , devicetree@vger.kernel.org, Richard Zhu , Grant Likely , linux-pci@vger.kernel.org Cc: bunnie@kosagi.com, Sean Cross List-Id: devicetree@vger.kernel.org Some PCIe ports gate power to the slot. In order to prevent system lockup, these boards must enable power to the slot before attempting communication over the PCI bus. Signed-off-by: Sean Cross --- .../devicetree/bindings/pci/fsl,imx6q-pcie.txt | 3 +++ drivers/pci/host/pci-imx6.c | 27 ++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt index 6fbba53..a806b68 100644 --- a/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt +++ b/Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt @@ -13,6 +13,9 @@ Required properties: - clock-names: Must include the following additional entries: - "pcie_phy" +Optional properties: +- bus-supply: A regulator that controls power to the entire bus + Example: pcie@0x01000000 { diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c index 69202d1..8e4f957 100644 --- a/drivers/pci/host/pci-imx6.c +++ b/drivers/pci/host/pci-imx6.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,7 @@ struct imx6_pcie { struct pcie_port pp; struct regmap *iomuxc_gpr; void __iomem *mem_base; + struct regulator *bus_supply; }; /* PCIe Root Complex registers (memory-mapped) */ @@ -523,6 +525,7 @@ static struct pcie_host_ops imx6_pcie_host_ops = { static int __init imx6_add_pcie_port(struct pcie_port *pp, struct platform_device *pdev) { + struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp); int ret; if (IS_ENABLED(CONFIG_PCI_MSI)) { @@ -544,9 +547,22 @@ static int __init imx6_add_pcie_port(struct pcie_port *pp, pp->root_bus_nr = -1; pp->ops = &imx6_pcie_host_ops; + if (imx6_pcie->bus_supply) { + ret = regulator_enable(imx6_pcie->bus_supply); + if (ret) { + dev_err(pp->dev, + "unable to enable bus supply: %d\n", ret); + return ret; + } + } + ret = dw_pcie_host_init(pp); if (ret) { dev_err(&pdev->dev, "failed to initialize host\n"); + + if (imx6_pcie->bus_supply) + regulator_disable(imx6_pcie->bus_supply); + return ret; } @@ -588,6 +604,17 @@ static int __init imx6_pcie_probe(struct platform_device *pdev) } } + /* Fetch bus supply */ + imx6_pcie->bus_supply = devm_regulator_get_optional(&pdev->dev, "bus"); + if (IS_ERR(imx6_pcie->bus_supply)) { + ret = PTR_ERR(imx6_pcie->bus_supply); + if (ret == -EPROBE_DEFER) + return ret; + + dev_err(&pdev->dev, "unable to get bus-supply\n"); + return ret; + } + /* Fetch clocks */ imx6_pcie->pcie_phy = devm_clk_get(&pdev->dev, "pcie_phy"); if (IS_ERR(imx6_pcie->pcie_phy)) { -- 2.1.3